Android: получить фрагмент из PagerAdapter

Итак, я пытаюсь реализовать 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)» для ссылки на нулевой объект

Как мне получить вид из этого фрагмента? Это даже правильный способ получить фрагмент из пейджера? Я рвал на себе волосы из-за этого. Я просто хочу отобразить отображаемый фрагмент и изменить его представление и дочерние элементы.

Спасибо!


person Jellio    schedule 10.10.2015    source источник


Ответы (1)


FragmentStatePagerAdapter.instantiateItem() создает новый Fragment, вызывая getItem(). Ваш getItem() создает новый экземпляр CustomFragment при каждом вызове. Поэтому, когда вы вызываете isntantiateItem(), вы получаете новый экземпляр CustomFragment, а не тот, который используется адаптером.

Вам может понадобиться сохранить экземпляры CustomFragment в вашем адаптере и написать метод для их получения по индексу.

Я не уверен в вашем полном варианте использования, поэтому я не могу посоветовать, как вы могли бы изменить свой адаптер. Я имею в виду, что я не знаю, к какому фрагменту вы хотите получить доступ, если это тот, который показан в данный момент, или какой-то далекий, который далеко ушел за пределы экрана.

person Abdullah    schedule 10.10.2015