Searched and saw a few posts for the similar question, but no working solution. Post here to see if someone have solved it.
Having FragmentTabHost in a fragment, and trying to get current tab's content fragment.
in mTabHost.setOnTabChangedListener's onTabChanged(String tabTag) the frgmt = getChildFragmentManager().findFragmentByTag(tabTag); returns null.
mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabTag) {
Fragment frgmt = getChildFragmentManager().findFragmentByTag(tabTag);
}
});
In FragmentTabHost, its onTabChanged() calls doTabChanged() which instantiates the content fragment and add with FragmentTransaction, or attach to it if the fragment exist.
I guess when FragmentTabHost::onTabChanged() calls into the listener's onTabChanged(), the fragment is still not ready in the FragmentManager by getChildFragmentManager().
Is there a way the get the mLastTab from the FragmentTabHost? It should have the current content fragment.
Thanks for the help!
@Override
public void onTabChanged(String tabId) {
if (mAttached) {
FragmentTransaction ft = doTabChanged(tabId, null);
if (ft != null) {
ft.commit();
}
}
if (mOnTabChangeListener != null) {
mOnTabChangeListener.onTabChanged(tabId);
}
}
private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) {
TabInfo newTab = null;
for (int i=0; i<mTabs.size(); i++) {
TabInfo tab = mTabs.get(i);
if (tab.tag.equals(tabId)) {
newTab = tab;
}
}
if (newTab == null) {
throw new IllegalStateException("No tab known for tag " + tabId);
}
if (mLastTab != newTab) {
if (ft == null) {
ft = mFragmentManager.beginTransaction();
}
if (mLastTab != null) {
if (mLastTab.fragment != null) {
ft.detach(mLastTab.fragment);
}
}
if (newTab != null) {
if (newTab.fragment == null) {
newTab.fragment = Fragment.instantiate(mContext,
newTab.clss.getName(), newTab.args);
ft.add(mContainerId, newTab.fragment, newTab.tag);
} else {
ft.attach(newTab.fragment);
}
}
mLastTab = newTab;
}
return ft;
}