Получение ссылки на вложенный фрагмент из 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.
Надеюсь, что это поможет.