用自己替换片段不会显示任何内容

问题描述:

我试图决定并在活动的onResume方法中显示片段,但是如果再次选择先前添加的片段,则活动将变为空白。用自己替换片段不会显示任何内容

示例代码(有一个片段):

@Override 
protected void onResume(){ 
    FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 

    trans.replace(R.id.myLayout, fragA); 

    trans.commit(); 
    getSupportFragmentManager().executePendingTransactions(); 
} 

利用上述代码中,当首次创建的活性,它显示弗拉加正确,但在情况下,我按主页主要和然后切换回我的活动(为了再次激发onResume),它全部变为空白(看起来像fragA被移除)。

正在替换之前添加的片段是否会自行删除?或者如果它被替换为自己,怎么不松散一个片段?

你不能用自己替换一个片段。替换的前半部分是删除该ID处的前一个片段。一旦片段被移除,片段管理器就不能再添加或使用该片段(所以替换的添加部分将无法正常工作)。

根据您的使用情况下,你有两个选择:

  1. 创建一个新片段,而不是重用现有的实例
  2. 使用一些其他的方法,看是否需要它来替换你的片段

最后,您可能不需要调用executePendingTransactions。

+0

我在* onCreate *中初始化** fragA **,这意味着我会继续引用我的片段。那么为什么它不允许在删除该片段后添加它? – waqaslam 2013-02-19 14:26:33

+0

因为我所说的。一旦你删除了一个片段的实例,你不能再添加它。它的销毁,完成,不再可用。 – 2013-02-19 14:58:01

+0

要检查的另一件事是,R.id.myLayout是您希望将您的片段放入的容器的ID。如果是这样,尝试切换你的替换调用替换(R.id.myLayout,新的FragmentAClass()) – 2013-02-19 15:03:17

你可以试试:

if(!(getSupportFragmentManager().findFragmentById(R.id.myLayout) instanceof FragmentA)) { 
    FragmentTransaction trans = getSupportFragmentManager().beginTransaction(); 

    trans.replace(R.id.myLayout, fragA); 

    trans.commit(); 
} 

而且我认为弗拉加是FragmentA类对象。

+0

'R.id.myLayout'指向其中** **弗拉加注入的布局。我不认为'findFragmentById(R.id.myLayout)'会返回我对我的片段的引用。 – waqaslam 2013-02-19 14:28:49

+0

如果您的片段位于此容器中,则它将返回对此注入片段的引用。然后你可以检查它是否是你的片段类的实例。 – 2013-02-19 14:31:25

+0

这是有效的,如果你正在片段中创建片段,这是非常有趣的解决方案。 – 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 
    } 
}