替换的片段仍然可见

Posted

技术标签:

【中文标题】替换的片段仍然可见【英文标题】:Replaced fragment still visible 【发布时间】:2013-05-14 10:23:30 【问题描述】:

当我启动我的应用程序时,它运行AsyncTask 来加载,然后在onPostExecute 中,然后我将setContentView 添加到新布局中,然后添加一个带有两个按钮的片段,通过添加FragmentTransaction 提供两种模式。单击两种模式中的一种后,它会使用替换方法将片段替换为另一个FragmentTransaction

如果应用程序崩溃,它会返回到第一个屏幕,加载提供两种模式的两个按钮。在这种情况下,如果选择了任一模式,则加载第二个片段,但现在背景突然透明,显示下面的两个按钮,它们仍然可点击。如果再次单击它们,它们会正确替换片段,使其在下方不可见。这很奇怪,我不明白是什么原因造成的。

我研究并看到了这两个类似的问题,one 和two,这表明可能是因为 ID 错误或者我在 XML 中定义了片段。这两个因素都不是。

我的代码如下所示:

下面我替换加载屏幕。

@Override
    protected void onPostExecute(Void result) 
        setContentView(R.layout.activity_main_screen);
        FragmentTransaction transaction = getSupportFragmentManager()
                .beginTransaction();
        transaction.add(R.id.fragment_container, new ModeFragment())
                .commit();
            

之后,当单击按钮时,我将希望替换当前的片段传递到下面的此方法中:

private void replaceCurrentFragment(Fragment fragment) 
    FragmentTransaction transaction = getSupportFragmentManager()
            .beginTransaction();
    transaction.replace(R.id.fragment_container, fragment)
            .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
            .addToBackStack(null).commit();

这第一次有效,但是如果发生崩溃,则应用程序将返回到第一个片段,并且第二次传递此方法时,新的替换片段是半不可见的。再次单击第一个片段上的按钮再次调用此方法,现在可以了。

显然我不希望应用程序崩溃,所以这不应该发生,但我感觉我编写代码的方式有问题。

【问题讨论】:

【参考方案1】:

我也遇到过同样的问题,那是因为我在Activity的OnCreate中加载了一个fragment,没有检查是否有savedInstanceState,所以android先重新打开所有旧的fragment,然后再做OnCreate,它将片段添加到旧片段上而不替换它们,因此当您导航到另一个片段时,它只会替换顶部的片段,而不是底部的片段,因此您会看到它下面的片段。 p>

对你来说可能不完全一样,但它可能会帮助你弄清楚。

【讨论】:

这应该是评论而不是答案。 我的问题在于我的摘要 XML 布局文件中 HoloGraph 元素(用于绘制图表的小库)中的背景属性。我删除了该属性并且它起作用了。我在分离后替换了我的片段,以刷新片段,但实际上我不需要替换片段,我只需要分离、附加(调用片段的 onCreateView)和提交。如果您有类似的问题并且必须将数据传递给您的片段,我建议您将数据从片段的包中存储到另一个类中的某些字段的位置。在片段的 onCreateView 中访问它们。

以上是关于替换的片段仍然可见的主要内容,如果未能解决你的问题,请参考以下文章

添加片段后,前一个片段仍然可见

当片段被替换并且再次可见时回调

为什么在某些情况下,尽管进行了更新,但线程的更新仍然不可见?

用片段替换某些东西

我在片段中看不到选项菜单

如何从活动中更改片段中视图的可见性