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

我试图决定并在活动的onResume方法中显示片段,但是如果再次选择先前添加的片段,则活动将变为空白。

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

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

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

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

使用上面的代码,当第一次创建活动时,它正确显示fragA ,但如果我按Home键然后切换回我的活动(为了再次激发onResume ),它全部变为空白(看起来像fragA已移除)。

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


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

根据您的使用情况,您有两种选择:

  • 创建一个新的片段,而不是重新使用现有的实例
  • 使用其他方法来查看是否有必要替换你的片段
  • 最后,你可能不需要调用executePendingTransactions。


    你可以试试:

    if( !(getSupportFragmentManager().findFragmentById(R.id.myLayout) instanceof FragmentA) ) {
        FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
    
        trans.replace(R.id.myLayout, fragA);
    
        trans.commit();
    }
    

    我假设fragA是FragmentA类对象。


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

    @Override
    protected void onResume() {
        if (!fragA.isAdded()) {
            FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
            trans.replace(R.id.myLayout, fragA);
            trans.commit();
            //getSupportFragmentManager().executePendingTransactions();   //unnecessary
        }
    }
    
    链接地址: http://www.djcxy.com/p/81409.html

    上一篇: Replacing a Fragment with itself does not show anything

    下一篇: Symfony splitted embedded form