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 的事务替换落后的主要内容,如果未能解决你的问题,请参考以下文章