引起:java.lang.IllegalStateException:onSaveInstanceState 后无法执行此操作

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/40267990/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 05:05:29  来源:igfitidea点击:

Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

javaandroidandroid-fragmentsandroid-permissions

提问by yacky

I am trying to get permissions for reading calendar, after getting the permissions I am trying to call another fragment. I am stuck with the following exception.This happens for the first launch of the application only.For the next launch application works fine.

我正在尝试获得阅读日历的权限,在获得权限后,我试图调用另一个片段。我遇到了以下异常。这只发生在第一次启动应用程序时。下次启动应用程序工作正常。

5488-5488/com.mindtree.calenderevents E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.mindtree.calenderevents, PID: 5488
java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=2, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.mindtree.calenderevents/com.mindtree.calenderevents.MainActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
   at android.app.ActivityThread.deliverResults(ActivityThread.java:4998)
   at android.app.ActivityThread.handleSendResult(ActivityThread.java:5041)
   at android.app.ActivityThread.access00(ActivityThread.java:229)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:148)
   at android.app.ActivityThread.main(ActivityThread.java:7325)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
   at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1533)
   at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1551)
   at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:696)
   at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:662)
   at com.mindtree.calenderevents.MainActivity.onRequestPermissionsResult(MainActivity.java:59)
   at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7291)
   at android.app.Activity.dispatchActivityResult(Activity.java:7169)
   at android.app.ActivityThread.deliverResults(ActivityThread.java:4994)
   at android.app.ActivityThread.handleSendResult(ActivityThread.java:5041)?
   at android.app.ActivityThread.access00(ActivityThread.java:229)?
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875)?
   at android.os.Handler.dispatchMessage(Handler.java:102)?
   at android.os.Looper.loop(Looper.java:148)?
   at android.app.ActivityThread.main(ActivityThread.java:7325)?
   at java.lang.reflect.Method.invoke(Native Method)?
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)?
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)?

This is my code

这是我的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
        TopSectionFragment fragment = TopSectionFragment.newInstance();
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment, fragment)
            .commit();

}

@Override
public void getEvents() {
    Log.i("mainacteventmethod ","mainacteventmethod");
    //TODO: implement method to fetch events from calendar and add as fragment arguments
    getPermissionToReadCalender();

}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case READ_CALENDER: {

            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted, yay! Do the
                // contacts-related task you need to do.
                RuntimeData.setsCalendarData(getCalender(null));
                if (RuntimeData.getsCalendarData() != null) {
                    BottomSectionFragment bottomFragment = new BottomSectionFragment();
                    getSupportFragmentManager().beginTransaction().replace(R.id.fragment2,
                            bottomFragment).commit();
                }

            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }
        // other 'case' lines to check for other
        // permissions this app might request
    }
}

private void getPermissionToReadCalender() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) != PackageManager.PERMISSION_GRANTED) {

        if (shouldShowRequestPermissionRationale(
                Manifest.permission.READ_CALENDAR)) {
        }
        requestPermissions(new String[]{Manifest.permission.READ_CALENDAR},
                READ_CALENDER);

    }else{
        RuntimeData.setsCalendarData(getCalender(null));
        if (RuntimeData.getsCalendarData() != null) {
            BottomSectionFragment bottomFragment = new BottomSectionFragment();
            getSupportFragmentManager().beginTransaction().replace(R.id.fragment2,
                    bottomFragment).commit();
        }
    }

}

回答by Shadesblade

This exception occurs if you try to perform a fragment transition after your fragment activity's onSaveInstanceState()gets called.

如果您onSaveInstanceState()在调用片段活动后尝试执行片段转换,则会发生此异常。

To test if this is the case here, override onSaveInstanceState() so it doesn't call the super method.

要测试这里是否是这种情况,请覆盖 onSaveInstanceState() 使其不调用 super 方法。

@Override
protected void onSaveInstanceState(Bundle outState) {
    //No call for super(). 
}

If this fixes the problem, instead of commit()on your fragment manager, use commitAllowingStateLoss();

如果这解决了问题,而不是commit()在您的片段管理器上,请使用commitAllowingStateLoss();