Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 片段事务处理后,新片段';用户界面是透明的,使整个应用程序没有响应_Android_Android Fragments_Android Animation_Android Lifecycle - Fatal编程技术网

Android 片段事务处理后,新片段';用户界面是透明的,使整个应用程序没有响应

Android 片段事务处理后,新片段';用户界面是透明的,使整个应用程序没有响应,android,android-fragments,android-animation,android-lifecycle,Android,Android Fragments,Android Animation,Android Lifecycle,存在片段A和B。应用程序以A开始,然后,如果满足某些条件,则使用幻灯片动画自动导航到B: fragmentTransaction .setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_right, R.anim.slide_out_left) .replace(R.id.container, mCurrentFragment, fragmentId) .commitAllowingSt

存在片段A和B。应用程序以A开始,然后,如果满足某些条件,则使用幻灯片动画自动导航到B:

fragmentTransaction
.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_right, R.anim.slide_out_left)
.replace(R.id.container, mCurrentFragment, fragmentId)
.commitAllowingStateLoss();
我知道在
mCurrentFragment
中保留对片段的引用是不好的,但是在这种情况下,这个引用不用于任何可疑的东西

在大多数情况下,一切正常

但是,如果应用程序在显示某些系统对话框时启动(例如,在使用OTG将设备连接到USB时批准应用程序的自动启动),则会发生一些非常奇怪的事情:应用程序导航到片段B,但其UI未显示,并且保持透明

我复制了这个问题,甚至AndroidStudio的布局检查器也声称当前可见的UI属于片段B。当这种情况发生时,由于片段B是透明的,我可以看到片段A的UI,但无法与之交互。应用程序对任何触摸事件都没有响应,需要终止

我添加了一些日志记录,可以看到以下内容:

// app start
[main] INFO   MainActivity onStart
[main] INFO   MainActivity onResume
[main] INFO   FragmentA onResume
// system dialog shown
[main] INFO   MainActivity onPause
[main] INFO   FragmentA onPause
// replace fragment
[main] INFO   navigateTo(); fragmentName: FragmentB
[main] INFO   FragmentA onStop
[main] INFO   FragmentB onViewCreated
[main] INFO   FragmentB onStart
// dismiss system dialog
[main] INFO   MainActivity onResume
[main] INFO   FragmentB onResume
看起来问题可能与应用程序“暂停”时导航发生有关

此外,我发现它描述了非常相似(可能相同)的问题,它表明该问题可能与片段事务上的动画有关

编辑:

在执行了多个测试之后,这个bug看起来确实与动画片段事务有关,因为如果我删除动画,我就无法复制它

编辑2:

忘了提及此应用程序尚未迁移到AndroidX,因此它使用了支持片段:

implementation 'com.android.support:appcompat-v7:28.0.0'
编辑3:

我试图构建一个最小的独立应用程序来重现这个问题。虽然它在生产应用程序中很容易复制,但我无法在这个独立的回购中复制它。试图在生命周期方法中添加可变数量的延迟,但没有帮助。现在我开始想,它也可能被重新配置到其他一些功能上


我有一些解决方法的想法,可以用来修复这个bug,但我真的很想知道这个行为的根本原因,以及它是应用程序中的bug还是Android框架中的bug。

你粘贴的代码都是复制错误所需要的?@RamiLoiferman这个应用程序非常大而且凌乱,所以我不能发布它的所有代码。然而,就我目前所见,这种行为与其他行为无关。不幸的是,我需要一个单独的复制案例,因为我自己似乎无法复制它。请尝试将片段添加到后堆栈中,而不是替换它。使用
fragmentManager.beginTransaction().add(R.id.container,null.commit()片段事务在活动暂停时发生,我怀疑问题可能来自于此。如果你阻止这可能是它的工作?