Внутри моего MainActivity.java
Я реализую фрагмент навигации для материального дизайна. Когда я нажимаю одну из опций навигации, появляется новый фрагмент - я хочу, чтобы этот фрагмент разбился на два отдельных фрагмента, которые можно переключить. Вкладки.Фрагмент Вкладки внутри Фрагмент - Нулевой указатель Исключение
Я создаю первоначально показан один из этих двух фрагментов внутри MainActivity
:
public void onNavigationDrawerItemSelected(int position) {
// etc...
case 1: fragment = new OffersSentFragment();
}
Затем сделайте простую FragmentPagerAdaptor
(я вырезал ненужный код этого вопроса):
public class OffersFragmentPagerAdapter extends FragmentPagerAdapter {
final int PAGE_COUNT = 2;
private String tabTitles[] = new String[] { "Offers Made", "Offers Received" };
private Context context;
public OffersFragmentPagerAdapter(FragmentManager fm, Context context) {
super(fm);
this.context = context;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0: return OffersSentFragment.newInstance("Sent");
case 1: return OffersReceivedFragment.newInstance("Received");
default: return null;
}
}
}
Затем я делаю два фрагмента, которые будут вставлены между (OffersSentFragment
и OffersReceivedFragment
), оба из которых в этот момент в основном одинаковы (один из которых показан ниже).
Моя проблема заключается в том, что линия:
viewPager.setAdapter(new OffersFragmentPagerAdapter(getFragmentManager(), getActivity()));
в onCreateView()
ниже методом вызывает java.lang.NullPointerException
- этот метод, как правило, работают в деятельности (this tutorial is similar to my code but uses an Activity instead), но либо getFragmentManager()
или getActivity()
, кажется, probomatic в фрагменте , Что именно вызывает это?
public class OffersSentFragment extends Fragment {
private static final String ARG_PARAM1 = "param1";
private String mParam1;
private OnFragmentInteractionListener mListener;
public static OffersSentFragment newInstance(String param1) {
OffersSentFragment fragment = new OffersSentFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
fragment.setArguments(args);
return fragment;
}
public OffersSentFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.viewpager);
// THE LINE BELOW IS THE NULL POINTER ERROR
viewPager.setAdapter(new OffersFragmentPagerAdapter(getFragmentManager(), getActivity()));
SlidingTabLayout slidingTabLayout = (SlidingTabLayout) getActivity().findViewById(R.id.sliding_tabs);
slidingTabLayout.setDistributeEvenly(true);
slidingTabLayout.setViewPager(viewPager);
return inflater.inflate(R.layout.fragment_offers_made, container, false);
}
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
public void onFragmentInteraction(Uri uri);
}
}
My 'R.id.viewpager' лежит в файле' layout', который я пытаюсь вернуть сразу после него - 'return inflater.inflate (R.layout.fragment_offers_made, container, false);'. Я не уверен, что мне нужно дублировать этот код в обоих фрагментах, чтобы отобразить адаптер. – user13466732
Я редактировал свой пост, см. Код, который я опубликовал, и попробуйте его :) – Moonbloom
В любом случае я могу обернуть компоновку вкладок ('fragment_offers_made') внутри rootView вместо того, чтобы возвращать rootView? Это заставляет меня иметь вкладки внутри вкладок в моем первом фрагменте (так как этот код реализован в 'onCreateView'' OfferSendFragment') - вторая вкладка отображает его собственный макет, как и ожидалось, поскольку я просто возвращаю 'inflater.inflate (R.layout .fragment_offers_received, container, false); 'в этом. – user13466732