Итак, я пытаюсь реализовать ViewPager с пользовательским FragmentStatePagerAdapter. В моей MainActivity я пытаюсь получить доступ к отображаемому фрагменту, чтобы изменить дочерние элементы внутри представления этого фрагмента.
Вот пользовательский фрагмент:
public class CustomFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_custom, container, false);
return rootView;
}
}
Вот FragmentStatePagerAdapter:
public class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
private int NUM_PAGES;
public ScreenSlidePagerAdapter(FragmentManager fm, int NUM_PAGES) {
super(fm);
this.NUM_PAGES = NUM_PAGES;
}
@Override
public int getCount() {
return NUM_PAGES;
}
@Override
public Fragment getItem(int position) {
return new CustomFragment();
}
}
Вот важная часть в MainActivity. Здесь я пытаюсь получить фрагмент, отображаемый в настоящее время адаптером пейджера. mPagerAdapter.instantiateItem возвращает фрагмент, но когда я вызываю primaryFragment.getView(), я получаю нулевой указатель.
moveViewPagerToIndex(); // Move the view pager to NUM_PAGES / 2 to start
primaryFragment = (CustomFragment) mPagerAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem());
updateFragment();
Фрагмент обновления():
ArrayList<Button> arrayList = Utility.getCellsFromCalendarFragment(primaryFragment.getView());
for (int i = 0; i < arrayList.size(); i++) {
// do stuff with all the cells
}
Utility.getCellsFromCalendarFragment (представление rootView)
public static ArrayList<Button> getCellsFromCalendarFragment(View rootView) {
ArrayList<Button> cellList = new ArrayList<>();
cellList.add((Button) rootView.findViewById(R.id.cell00));
cellList.add((Button) rootView.findViewById(R.id.cell01));
cellList.add((Button) rootView.findViewById(R.id.cell02));
// There are a lot more than 3 cells... There's roughly 50 cells.
return cellList
}
Я прогнал отладчик в Android Studio и посмотрел переменную 'primaryFragment'. Когда я вызываю mViewPager.instantiateItem(...), я получаю реальный CustomFragment. Проблема в том, что 'primaryFragment' теперь имеет нулевое представление, поэтому, когда я пытаюсь получить доступ к представлению для изменения ячеек, я получаю исключение NullPointerException.
Вызвано: java.lang.NullPointerException: попытка вызвать виртуальный метод «android.view.View android.view.View.findViewById(int)» для ссылки на нулевой объект
Как мне получить вид из этого фрагмента? Это даже правильный способ получить фрагмент из пейджера? Я рвал на себе волосы из-за этого. Я просто хочу отобразить отображаемый фрагмент и изменить его представление и дочерние элементы.
Спасибо!