用自己替换片段不会显示任何内容
我试图决定并在活动的onResume方法中显示片段,但是如果再次选择先前添加的片段,则活动将变为空白。用自己替换片段不会显示任何内容
示例代码(有一个片段):
@Override
protected void onResume(){
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.myLayout, fragA);
trans.commit();
getSupportFragmentManager().executePendingTransactions();
}
利用上述代码中,当首次创建的活性,它显示弗拉加正确,但在情况下,我按主页主要和然后切换回我的活动(为了再次激发onResume),它全部变为空白(看起来像fragA被移除)。
正在替换之前添加的片段是否会自行删除?或者如果它被替换为自己,怎么不松散一个片段?
你不能用自己替换一个片段。替换的前半部分是删除该ID处的前一个片段。一旦片段被移除,片段管理器就不能再添加或使用该片段(所以替换的添加部分将无法正常工作)。
根据您的使用情况下,你有两个选择:
- 创建一个新片段,而不是重用现有的实例
- 使用一些其他的方法,看是否需要它来替换你的片段
最后,您可能不需要调用executePendingTransactions。
你可以试试:
if(!(getSupportFragmentManager().findFragmentById(R.id.myLayout) instanceof FragmentA)) {
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.myLayout, fragA);
trans.commit();
}
而且我认为弗拉加是FragmentA类对象。
'R.id.myLayout'指向其中** **弗拉加注入的布局。我不认为'findFragmentById(R.id.myLayout)'会返回我对我的片段的引用。 – waqaslam 2013-02-19 14:28:49
如果您的片段位于此容器中,则它将返回对此注入片段的引用。然后你可以检查它是否是你的片段类的实例。 – 2013-02-19 14:31:25
这是有效的,如果你正在片段中创建片段,这是非常有趣的解决方案。 – 2014-05-13 17:57:16
最后,我不得不在更换碎片之前进行检查。如果请求(已添加)片段再次替换,我必须检查它是否已经添加,然后忽略替换,否则继续。例如:
@Override
protected void onResume() {
if (!fragA.isAdded()) {
FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
trans.replace(R.id.myLayout, fragA);
trans.commit();
//getSupportFragmentManager().executePendingTransactions(); //unnecessary
}
}
我在* onCreate *中初始化** fragA **,这意味着我会继续引用我的片段。那么为什么它不允许在删除该片段后添加它? – waqaslam 2013-02-19 14:26:33
因为我所说的。一旦你删除了一个片段的实例,你不能再添加它。它的销毁,完成,不再可用。 – 2013-02-19 14:58:01
要检查的另一件事是,R.id.myLayout是您希望将您的片段放入的容器的ID。如果是这样,尝试切换你的替换调用替换(R.id.myLayout,新的FragmentAClass()) – 2013-02-19 15:03:17