3

我一直在努力解决一个让我发疯多年的问题。我有一个带有一个 Activity 的应用程序,它通过动态片段交换显示不同的屏幕,即通常的

getFragmentManager().beginTransaction().replace(R.id.fragementContainer, new SomeFragment()).commit();

这在我的 Nexus 4、Nexus 5、Nexus 7 2012、Nexus 7 2013、Moto G 1st gen 等上非常有效。除了三星设备(SGS5、SGS6)之外的所有设备。在这些设备上,有时(很少,但也不少)replace()调用似乎被误解为add()调用,并且新片段出现在前一个片段之上。

我曾尝试复制该错误,但似乎没有任何模式。由于我在任何地方都没有收到错误消息,因此我无法真正解决它。

4

2 回答 2

3

这就是我总是使用支持库的原因。源代码在您的项目中,未经第三方修改。您是否已经在使用支持包?

于 2015-07-27T21:35:37.197 回答
1

这很可能是由三星的一些“优化”引起的。我唯一能建议的是使用remove()andadd()而不是replace(). 内部的实现FragmentTransaction是不同的,因此它的行为可能会有所不同。

您实际上可以轻松删除片段,因为它与容器具有相同的 id。尝试这个:

FragmentTransaction transaction = fragmentManager.beginTransaction();

Fragment oldFragment = fragmentManager.findFragmentById(R.id.container);
if (oldFragment != null) transaction.remove(oldFragment);

transaction.add(R.id.container, new Fragment(), "tag").commit();
于 2015-07-27T20:45:42.293 回答