【问题标题】:Replacing a Fragment with itself does not show anything用自己替换片段不会显示任何内容
【发布时间】:2013-02-19 13:53:20
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: android replace android-fragments onresume


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我在 onCreate 中初始化了 fragA,这意味着我确实保留了对我的片段的引用。那么为什么它不允许在删除该片段后添加它呢?
    • 因为正是我所说的。一旦你删除了一个片段的实例,你就不能再添加它了。它已被销毁,已完成,不再可用。
    • 要检查的另一件事是 R.id.myLayout 是您希望将片段放入的容器的 ID。如果是,请尝试将替换调用切换为 replace(R.id.myLayout, new FragmentAClass())
    • @Waqas 虽然这个答案被标记为已接受,但它对我不起作用,当我创建片段的新实例时(建议 #1)什么也没发生,当前片段没有被替换。
    • 我怀疑这个“一旦一个片段被删除,它就不能再被片段管理器添加或使用”,我尝试了两个片段并一次又一次地替换,它可以工作好吧。
    【解决方案2】:

    你可以试试:

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

    我假设 fragA 是 FragmentA 类对象。

    【讨论】:

    • R.id.myLayout 指向注入 fragA 的布局。我认为findFragmentById(R.id.myLayout) 不会返回对我的片段的引用。
    • 如果您的片段在此容器中,那么它将返回对该注入片段的引用。然后你可以检查它是否是你的片段类的实例。
    • 这行得通,如果您在片段中创建片段,这是非常有趣的解决方案。
    【解决方案3】:

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

    @Override
    protected void onResume() {
        if (!fragA.isAdded()) {
            FragmentTransaction trans = getSupportFragmentManager().beginTransaction();
            trans.replace(R.id.myLayout, fragA);
            trans.commit();
            //getSupportFragmentManager().executePendingTransactions();   //unnecessary
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      fragmentTransaction.addToBackStack(null); 
      

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

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

      你可以在末尾找到这个of this page

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多