2015-05-24 2 views
0

Внутри моего 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); 
    } 
} 

ответ

0

Я считаю, что проблема заключается в следующей строке:

ViewPager viewPager = (ViewPager) getActivity().findViewById(R.id.viewpager); 

Потому что вы пытаетесь найти «R.id.viewpager» в вашей деятельности. Для этого вам придется в своей деятельности вызвать 'setContentView()' с xml-файлом, который имеет a в xml.
Я предполагаю, что у вас этого нет?
Потому что это означало бы, что ваша переменная viewPager будет пустой, и это вызовет исключение NullPointerException.

----- ИЗМЕНИТЬ ПОСЛЕ COMMENT -----

Тогда вам нужно найти «R.id.viewpager» на макете вы накачивания, и макет не деятельностью в.
Как это:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_offers_made, container, false); 
    ViewPager viewPager = (ViewPager) rootView.findViewById(R.id.viewpager); 
    viewPager.setAdapter(new OffersFragmentPagerAdapter(getFragmentManager(), getActivity())); 

    SlidingTabLayout slidingTabLayout = (SlidingTabLayout) rootView.findViewById(R.id.sliding_tabs); 
    slidingTabLayout.setDistributeEvenly(true); 
    slidingTabLayout.setViewPager(viewPager); 

    return view; 
} 

Найдет как ViewPager и SlidingTabLayout на взгляд вы раздувания, который должен работать, как вы хотели.

+0

My 'R.id.viewpager' лежит в файле' layout', который я пытаюсь вернуть сразу после него - 'return inflater.inflate (R.layout.fragment_offers_made, container, false);'. Я не уверен, что мне нужно дублировать этот код в обоих фрагментах, чтобы отобразить адаптер. – user13466732

+0

Я редактировал свой пост, см. Код, который я опубликовал, и попробуйте его :) – Moonbloom

+0

В любом случае я могу обернуть компоновку вкладок ('fragment_offers_made') внутри rootView вместо того, чтобы возвращать rootView? Это заставляет меня иметь вкладки внутри вкладок в моем первом фрагменте (так как этот код реализован в 'onCreateView'' OfferSendFragment') - вторая вкладка отображает его собственный макет, как и ожидалось, поскольку я просто возвращаю 'inflater.inflate (R.layout .fragment_offers_received, container, false); 'в этом. – user13466732