Android 三星设备对待零碎交易的方式是否与其他设备不同?

Android 三星设备对待零碎交易的方式是否与其他设备不同?,android,android-fragments,fragmenttransaction,samsung-touchwiz,Android,Android Fragments,Fragmenttransaction,Samsung Touchwiz,多年来,我一直在努力解决一个让我发疯的问题。我有一个带有一个活动的应用程序,通过动态片段交换显示不同的屏幕,即通常的 getFragmentManager().beginTransaction().replace(R.id.fragementContainer, new SomeFragment()).commit(); 这在我的Nexus 4、Nexus 5、Nexus 7 2012、Nexus 7 2013、Moto G第一代等设备上非常有效。除了三星设备(SGS5、SGS6)外,几乎所有

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

getFragmentManager().beginTransaction().replace(R.id.fragementContainer, new SomeFragment()).commit();
这在我的Nexus 4、Nexus 5、Nexus 7 2012、Nexus 7 2013、Moto G第一代等设备上非常有效。除了三星设备(SGS5、SGS6)外,几乎所有设备都可以使用。在这些设备上,replace()调用有时(很少,但还不够)被误解为add()调用,新片段出现在前一个片段的顶部


我尝试过复制这个bug,但似乎没有任何模式。因为我在任何地方都没有收到错误消息,所以我无法真正排除故障。

这很可能是由于三星的一些“优化”造成的。我唯一的建议是使用
remove()
add()
而不是
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();

这就是为什么我总是使用支持库。源代码在您的项目中,未被第三方修改。您已经在使用支持包了吗

我在三星设备上看到了很多奇怪的、断断续续的bug。比如,由于该应用程序显然拥有的权限丢失而导致的崩溃,否则它会在1000次中导致其他999次崩溃。我的直觉告诉我,他们对自己的多核CPU进行了过度优化,遇到了竞争环境。是的,这可能是三星的问题。尝试使用
remove()
add()
而不是
replace()
@Lamorak:我考虑过,但这种方法的问题是,我必须知道以前加载了哪个片段,这样我就可以调用remove(),这意味着代码中的if语句有很多混乱,我不明白。您的语句“…被误解为add()调用,新片段出现在前一个片段的顶部。”。replace()不是应该在previous的基础上显示新的片段吗?据我所知,replace()调用首先删除先前的片段,然后添加新的片段,这意味着旧片段不存在于新片段之后。感谢您的建议和使用findFragmentById()方法的想法,我从来没有想过使用它!我试过了,让我们看看会发生什么!我使用的是标准平台碎片,因此没有支持包碎片。切换到支持碎片也可能会对您有所帮助。@Lamorak:我相信它会给我提供标准行为,de Samsunged。我尝试了你的方法,如果不起作用,我将使用支持片段。@Antonis427你是否用支持库提供的片段替换了该片段?你还明白这个问题吗?如果没有,你能接受答案吗?