API-21 上 Fragment 的事务替换落后

Posted

技术标签:

【中文标题】API-21 上 Fragment 的事务替换落后【英文标题】:Fragment's Transaction replace on API-21 is staying behind 【发布时间】:2015-08-24 05:10:54 【问题描述】:

我正在开发一个使用片段的应用程序,上周我的测试设备进行了棒棒糖更新。当我在棒棒糖设备上测试我的应用时,我发现 Fragment Transaction 的替换方法无法正常工作。

虽然在 Kitkat 版本上一切正常,但它在 Lolipop 版本中的工作令人困惑。

为了说明我的情况,我添加了一些图片。

--第一个屏幕----------------------------KitKat-------------- -----------------------棒棒糖---------------

如您所见,当我使用kitkat 时,一切都很好,但是一旦我使用lolipop,片段事务替换就会令人困惑。

这是我的按钮代码;

mButtonOk.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 

                FeedbackFragment mFragmentFeedBack = new FeedbackFragment();
                android.app.FragmentManager fm = getFragmentManager();
                fm.executePendingTransactions();
                android.app.FragmentTransaction fragmentTransaction = fm.beginTransaction();
                if (mFragmentFeedBack.isVisible()) 
                    fragmentTransaction.hide(mFragmentFeedBack);
                 else 

                    if (!mFragmentFeedBack.isAdded()) 
                        fragmentTransaction.replace(R.id.containerfragment, mFragmentFeedBack);
                    


                    fragmentTransaction.show(mFragmentFeedBack);
                
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();

            
        );

这是我的 xml;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_
android:layout_ tools:context=".MainActivity">


<Button
    android:layout_
    android:layout_
    android:text="New Button"
    android:id="@+id/button"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="117dp" />

<FrameLayout
    android:layout_
    android:layout_
    android:id="@+id/containerfragment">

</FrameLayout>

编辑: Kitkat 版本正在平板电脑上运行,但我在手机上尝试了我的应用程序(Kitkat 版本)结果是一样的。没有变化。

谢谢。

【问题讨论】:

您在平板电脑(带棒棒糖)上签入了相同的应用程序吗?? 是的。它的作用相同。在测试棒棒糖版设备时,被替换的片段留在后面。 您说“我看到 Fragment Transaction 的替换方法无法正常工作”。但在我看来,由于代码 if (mFragmentFeedBack.isVisible()),执行的是 fragmentTransaction.hide 而不是 replace()。你认为这可能吗?在这种情况下,请至少检查 KitKat。 我认为Android fragmentTransaction.replace() 方法简单可靠。我们会看到.. 【参考方案1】:

可能的问题可能是代码:

if (mFragmentFeedBack.isVisible())

我不建议使用这种方法来检查可见性。根据文档@@Fragment isVisible(),它说

...这意味着:(1) 已添加,(2) 已将其视图附加到 窗口,并且 (3) 没有隐藏。

这部分句子不是很清楚。我怀疑 KitKat 说它不可见,但 Lollipop 说它是可见的,我同意 Lollipop 的实施。 KitKat 说 Fragment 已添加(是),视图已附加(是),隐藏(不是真的!)。 这实际上是其他 GUI 库的 GUI 问题,信不信由你!

可能的解决方案,目前:

    创建一个布尔标志,并在两个片段之间维护标志。如果这很简单,这是最好的。 检查按钮或视图是否可点击,不知道是哪个。这比检查 isVisible() 更可靠。 我认为代码设计比它应该的要复杂一些。目前,这是我的建议。当用户点击“新按钮”时,只需调用 replace() 方法,不要使用隐藏/显示方法。当用户点击反馈片段中的 SEND 按钮时,调用 popBackStack() 或 replace() 方法。那怎么样?

【讨论】:

您的解决方案在我看来不错,但是我无法检查按钮是否可点击。因为,按钮永远可点击。所以我无法在我的项目中实施这个解决方案。 :( 可能的解决方案#1怎么样? 我在#3 上添加了另一个可能的解决方案。如果你同意,你能找到它的示例代码吗? 太奇怪了,我只使用替换方法,第二个片段仍然落后。我可以和你分享我的代码。我添加了 github; github.com/salihyalcin/FragmentTransaction @salih,第二个片段是哪一个? mFragmentFeedBack?

以上是关于API-21 上 Fragment 的事务替换落后的主要内容,如果未能解决你的问题,请参考以下文章

使用 Transition 从 Fragment 启动 Activity(API 21 支持)

Android中的片段事务问题

Fragment事务管理源码分析

[Android]Fragment源代码分析 事务

Fragment事务管理源代码分析

将FragmentManger事务添加到返回栈中