6

我正在尝试决定并在活动的onResume方法中显示一个片段,但如果再次选择先前添加的片段,那么活动将变为空白。

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

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

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

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

使用上面的代码,当第一次创建活动时,它会正确显示fragA,但是如果我按下Home Key然后切换回我的活动(为了再次引发onResume),一切都会变成空白(好像 fragA 被删除了)。

替换之前添加的片段是否会自行删除?或者如果它被自己替换,如何不丢失一个片段?

4

4 回答 4

5

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

根据您的用例,您有两种选择:

  1. 创建一个新片段而不是重用现有实例
  2. 使用其他方法查看是否有必要替换您的片段

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

于 2013-02-19T14:02:09.450 回答
4

你可以试试:

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

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

    trans.commit();
}

我假设 fragA 是 FragmentA 类对象。

于 2013-02-19T14:21:18.957 回答
3

最后,我必须在更换碎片之前进行检查。如果再次请求替换(已经添加的)片段,我必须检查它是否已经添加然后忽略替换,否则继续。例如:

@Override
protected void onResume() {
    if (!fragA.isAdded()) {
        FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
        trans.replace(R.id.myLayout, fragA);
        trans.commit();
        //getSupportFragmentManager().executePendingTransactions();   //unnecessary
    }
}
于 2013-02-20T13:03:07.877 回答
0

引用回创建的片段时,请确保尝试添加

fragmentTransaction.addToBackStack(null); 

提交之前的方法,以便您的 Fragment 恢复而不是如开发人员指南中所述被销毁。

如果您在执行删除片段的事务时不调用 addToBackStack(),则该片段在事务提交时被销毁,并且用户无法导航回它。然而,如果您在删除片段时确实调用了 addToBackStack(),那么片段会停止,然后如果用户导航回来,则会恢复。

您可以在本页末尾找到它。

于 2018-10-17T12:46:30.847 回答