【发布时间】:2015-08-10 20:56:31
【问题描述】:
搜索并看到了一些类似问题的帖子,但没有有效的解决方案。 在这里发帖看看有没有人解决。
在片段中有 FragmentTabHost,并尝试获取当前选项卡的内容片段。
在 mTabHost.setOnTabChangedListener 的 onTabChanged(String tabTag) frgmt = getChildFragmentManager().findFragmentByTag(tabTag);返回 null。
mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabTag) {
Fragment frgmt = getChildFragmentManager().findFragmentByTag(tabTag);
}
});
在 FragmentTabHost 中,它的 onTabChanged() 调用 doTabChanged() 实例化内容片段并使用 FragmentTransaction 添加,或者如果片段存在则附加到它。
我猜想当 FragmentTabHost::onTabChanged() 调用监听器的 onTabChanged() 时,getChildFragmentManager() 在 FragmentManager 中还没有准备好片段。
有没有办法从 FragmentTabHost 获取 mLastTab?它应该有当前的内容片段。
感谢您的帮助!
@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;
}
【问题讨论】:
标签: android android-fragments fragment-tab-host