在onViewCreated()的MainFragment中,我尝试通过以下代码创建嵌套片段...
FragmentManager fm = getChildFragmentManager();
MainSubAFragment mainSubAFragment = MainSubAFragment.newInstance();
MainSubBFragment mainSubBFragment = MainSubBFragment.newInstance();
fm.beginTransaction()
.add(R.id.contentContainer, mainSubAFragment, MainSubAFragment.class.getName())
.add(R.id.contentContainer, mainSubBFragment, MainSubBFragment.class.getName())
.detach(mainSubBFragment)
.commit();
if (fm.executePendingTransactions()) {
showSubA();
}
执行executePendingTransaction后,我调用showSubA(),但没有希望返回null ..
public void showSubA() {
FragmentManager fm = getChildFragmentManager();
MainSubAFragment mainSubAFragment = (MainSubAFragment)
fm.findFragmentByTag(MainSubAFragment.class.getName());
MainSubBFragment mainSubBFragment = (MainSubBFragment)
fm.findFragmentByTag(MainSubBFragment.class.getName());
fm.beginTransaction()
.attach(mainSubAFragment)
.detach(mainSubBFragment)
.commit();
}
看起来分离是问题的原因??问题是..如果我调用detach我再也无法检索它了@ findFragmentByTag()??
项目示例:dropbox download
答案 0 :(得分:0)
首先创建碎片。只要扩展了Fragment类,就可以在Fragment类中创建片段而不是原始类名。像这样。
Fragment mainSubAFragment, mainSubBFragment;
现在我们必须提供带有碎片的指针。
mainSubAFragment = new MainSubAFragment();
< - 无需调用Object Class中的New Instance。
mainSubBFragment = new MainSubBFragment();
记住他们需要扩展到Fragment。我知道你做了。
现在我不知道为什么你必须得到ChildFragmentManager,但你可以直接获取FragmentManager;
FragmentManager fm = getFragmentManger();
FragmentTransaction ft = fm.beginTransaction();
现在一切准备就绪,我们转到执行部分。
ft.add(R.id.contentContainer,mainSubAFragment,MainSubAFragment.class.getName());
ft.add(R.id.contentContainer,mainSubBFragment,MainSubBFragment.class.getName());
ft.commit();
注意:它们将堆叠在那里听众,就像普通片段一样。因此,除非在XML中声明不要在那里堆叠监听器,否则如果它们位于同一位置,则会调用onclick。
提交后添加此内容。
你需要添加另一个片段交易,为什么?因为您所做的Commit()可能无法完成,即使这是逐行执行。相信我,大多数时候堆栈呼叫都是相互争斗的。
为避免这种情况,
FragmentTransaction transaction2 = fm.beginTransaction();
fm.hide(MainSubBFragment.class.getName());
总结一下。
Fragment mainSubAFragment, mainSubBFragment;
FragmentManager fm = getFragmentManger();
FragmentTransaction ft = fm.beginTransaction();
FragmentTransaction transaction2;
ft.add(R.id.contentContainer,mainSubAFragment,MainSubAFragment.class.getName());
ft.add(R.id.contentContainer,mainSubBFragment,MainSubBFragment.class.getName());
ft.commit();
transaction2 = fm.beginTransaction();
transaction2.hide(MainSubBFragment.class.getName());
transaction2.commit();
确保Fragment Transactions和FragmentManagers是全局变量。因此,它们可以被其他方法使用,而不是创建新实例。