Как получить элементы фрагментов, созданных ViewPager в MainActivity? - PullRequest
0 голосов
/ 20 января 2019

У меня есть несколько фрагментов, которые организованы с ViewPager. Я добавляю addOnPageChangeListener к ViewPager в методе MainActivity onCreate, который дает позицию выбранного фрагмента.

Несмотря на то, что я предотвращаю разрушение фрагментов, указав setOffscreenPageLimit, я до сих пор не выяснил, как получить доступ к фрагментам из MainActivity, так как простое использование findViewById возвращает исключения нулевого объекта.

Что я хочу сделать:

Я хотел бы получить доступ к элементам фрагментов, например, макеты и прокрутки в OnPageListener из ViewPager:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

@Override
    public void onPageSelected(int i) {

        if(i == 0) {
            // Do something with the first fragment.
        } else if(i == 1) {
            // Do something with the second fragment.
        }

    }

}

ViewPager использует FragmentPagerAdapter:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                return Fragment1.newInstance(position);
            case 1:
                return Fragment2.newInstance(position);
            case 2:
                return Fragment3.newInstance(position);
            case 3:
                return Fragment4.newInstance(position);
            default:
                throw new IllegalArgumentException();
        }
    }

    @Override
    public int getCount() {
        return 4;
    }
}

Что добавляется так:

mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mSectionsPagerAdapter);

~

Или я должен изменить свой подход?

Если доступ к фрагментам не может быть достигнут с помощью этой схемы, каким может быть эффективный альтернативный маршрут?

Я пытался реализовать ViewPager.onPageChangeListener в пользовательском ViewPager, но это не очень хороший вариант.

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

Я знаю, что подобные вопросы задавались ранее, но я не нашел в них решения.

1 Ответ

0 голосов
/ 20 января 2019

К сожалению, единственный "безопасный" способ сделать это - проверить исходный код FragmentPagerAdapter и посмотреть, с чем tag добавлен фрагмент - потому что findFragmentByTag является единственнымбезопасный способ получения фрагмента из FragmentManager.

Конечно, мы должны надеяться, что эта деталь реализации не изменится между версиями библиотеки поддержки, но на самом деле не изменилась за годы:)


В любом случае, поэтому FragmentPagerAdapter говорит:

    // Do we already have this fragment?
    String name = makeFragmentName(container.getId(), itemId);
    Fragment fragment = mFragmentManager.findFragmentByTag(name);

Так что же такое name?

private static String makeFragmentName(int viewId, long id) {
    return "android:switcher:" + viewId + ":" + id;
}

Чторавно viewId, а что такое id?

ViewId равно container.getId(), где container само по себе ViewPager.

id равно: final long itemId = getItemId(position);, что попо умолчанию return position;.


Таким образом, вы можете найти фрагмент следующим образом:

Fragment fragment = fragmentManager.findFragmentByTag("android:switcher:" + viewPager.getId() + ":" + fragmentPosition);
// if fragment is null, it was not created yet by ViewPager

ПРИМЕЧАНИЕ:

Стоит отметить, что вы НЕ должны полагаться на getItem(int position) {, чтобы возвращать тот же экземпляр фрагмента, который вы передали в , потому что это приведет вас к этой проблеме ,(Этот вопрос делает это правильно, метод getItem() всегда должен возвращать новый экземпляр Fragment.)

...