Получение ссылки на вложенный фрагмент из FragmentTabHost

В моем приложении я использую Activity, который содержит один Fragment с FragmentTabHost, и, следовательно, все его вкладки nested Fragments.

Внутри Activity, который содержит Fragment с его nested Fragment, мы можем получить ссылку на присоединенную с помощью onAttachedFragment().

Но как получить ссылку на nested Fragment из FragmentTabHost?

Ответы

Ответ 1

Хорошо, исследуя исходный код FragmentTabHost, я обнаружил, что когда он добавляет вкладку фрагмента, он присваивает тегу TabSpec вложенному Fragment.

Итак, чтобы получить ссылку на этот Fragment, мы должны называть

getChildFragmentManager().findFragmentByTag(tabSpecTag)

Ответ 2

Я пытался это сделать некоторое время, но я получал null, возвращенный из FragmentManager, потому что я пытался получить доступ к менеджеру в onCreateView() сразу после добавления.

Вот хорошее объяснение того, что произошло

Также важно отметить, что вкладки Fragment, которые еще не были выбраны, еще не существуют в FragmentManager, и так же вернет null. Я обошел это, вызвав mTabHost.setCurrentTab(index), прежде чем пытаться перейти к Fragment с помощью FragmentManager. Он не очень чистый, но он работает.

Ответ 3

Выше решения также работают, но у меня есть еще одно простое решение,

 @Override
public void onTabChanged(final String tabId) {

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {

            mFragment = getChildFragmentManager().findFragmentByTag("Tagname");
        }
    },1000);
}

Здесь вы должны реализовать FragmentTabHost.onTabChangeListener Мы сохранили вторую задержку в извлечении фрагмента из childFragmentManager.

Примечание. Вам нужно указать mFragment, какой фрагмент вы использовали.

Ответ 4

Я нашел решение, которое мне немного лучше, потому что оно не связано с выполнением кода с задержкой (что всегда с учетом фрагментации аппаратного обеспечения Android и разных скоростей процессора).

В вашем методе onTabChanged() перед попыткой найти фрагмент вызовите executePendingTransactions() в менеджере фрагментов, связанном с вашим tabHost. Кажется, что есть некоторые места в исходном коде FragmentTabHost, где они должны вызывать executePendingTransactions(), но не могут этого сделать.

Это работает каждый раз, когда вкладка изменяется с одним исключением... первая выбранная вкладка все равно возвращается null... В моем конкретном случае я смог обработать это исключение по-разному, поместив некоторый код в onResume.

Надеюсь, что это поможет.