Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/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 popBackStack和CommitteLowingStateLoss_Android - Fatal编程技术网

Android popBackStack和CommitteLowingStateLoss

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

我在Activity onCreate()方法中调用了popBackStack(),但是出现了异常:

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);
    }
}