Android popBackStack和CommitteLowingStateLoss
我在Activity onCreate()方法中调用了popBackStack(),但是出现了异常:Android popBackStack和CommitteLowingStateLoss,android,Android,我在Activity onCreate()方法中调用了popBackStack(),但是出现了异常: Caused by java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState android.app.FragmentManagerImpl.checkStateLoss (FragmentManager.java:1428) android.app.FragmentManage
Caused by java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
android.app.FragmentManagerImpl.checkStateLoss (FragmentManager.java:1428)
android.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:1446)
android.app.FragmentManagerImpl.popBackStack (FragmentManager.java:572)
我理解,如果您对UI和最终用户的影响满意,解决此异常的一种方法是调用CommitteAllowingStateLoss
问题是,popBackStack没有提交调用。是否有其他方法调用popBackStack并允许状态丢失
我应该说,我是在PostResume中这样做的,并且得到了这个例外。我从这个博客中得到了以下信息 如果在恢复活动状态之前调用的任何活动回调中都有
commit()
,则可能引发此错误。
所以做popbackbackback()
的最好地方是onresumeragments()
callback
popBackStack()
确实有一个内部调用的commit()
,因为它只是反转backstack中最后一个FragmentTransaction
。经过大量研究,我得出结论,当活动恢复时,在Android上操作片段是不可能的。根据上面提到的博文,我尝试了onPostResume()和onResumeFragments()从后台弹出片段,这两种方法在发布到生产时都会导致间歇性崩溃
这种情况的缺点是,例如,如果您希望显示一个级别结束的片段,然后是一个间隙广告,然后是下一个级别(作为级别结束片段的不同片段),那么就不可能使用片段
就我个人的情况而言,我从我的应用程序中删除了所有片段。我一直使用布局,因为用XML编辑UI很有用,但片段生命周期在其当前状态下不可用,所以我推出了自己的“片段”子系统,但更好,因为它可以从恢复时的活动中进行操作
我希望有一天谷歌会解决这个问题,因为它让Android开发变得非常不愉快。无论如何,如果有人需要使用片段,但不喜欢通常会遇到的典型onSaveInstanceState异常,这里是我的“GameScreen”实现(就像片段一样,只是更好)
/**
*游戏屏幕
*/
公共类游戏屏幕{
私有int-id;
私人视野;
私有视图组视图组;
受保护的主要活动主要活动;
公共游戏屏幕(MainActivity MainActivity,int id){
this.mainActivity=mainActivity;
this.id=id;
}
公共空心创建(LayoutFlater LayoutFlater、ViewGroup ViewGroup){
this.viewGroup=viewGroup;
视图=布局更平坦。充气(id、视图组、false);
添加视图(视图);
}
公开展览({
对于(int i=0;i
我认为在对非活动活动调用popBackStack()时会引发此错误。发布代码以进行调试further@arjun我从onPostResume中调用popBackStack,根据我能找到的所有参考资料,在应用程序恢复后调用popBackStack是一个安全的地方。我不能发布更多的代码,因为应用程序太大了,但归根结底是在onPostResume中调用popBackStack。当然,在应用程序安全恢复后,我必须在某个地方重新初始化GUI??正如@arjun所建议的,您是否尝试过在onResumeFragments()
中执行它?尝试应用!isFinishing()先添加/删除fragment@azizbekian活动没有onResumeFragments。FragmentActivity可以,但这不是我正在使用的。我没有使用FragmentActivity,只使用Activity。这篇博文(我以前读过)已经保证在onPostResume()中这样做会起作用——但显然不是这样。因此,该博客包含的信息从根本上是错误的。但建议使用AppCombatActivity
,它扩展了FragamentActivity
,您可以尝试使用onResumeFragments()
Callback。您能准确地举出推荐的位置吗?它当然不是在Android Studio中创建新片段活动项目时生成的默认基类;迁移所有代码不是一个坏主意。@rds-在同一句话中使用Android、Lifecycle和Consistent应该是一种犯罪:-)
/**
* GameScreen
*/
public class GameScreen {
private int id;
private View view;
private ViewGroup viewGroup;
protected MainActivity mainActivity;
public GameScreen(MainActivity mainActivity, int id) {
this.mainActivity = mainActivity;
this.id = id;
}
public void create(LayoutInflater layoutInflater, ViewGroup viewGroup) {
this.viewGroup = viewGroup;
view = layoutInflater.inflate(id, viewGroup, false);
viewGroup.addView(view);
}
public void show() {
for (int i = 0; i < viewGroup.getChildCount(); i++) {
View v = viewGroup.getChildAt(i);
if (v != view) {
v.setVisibility(View.INVISIBLE);
}
}
view.setVisibility(View.VISIBLE);
}
}