java - Caused by : java. lang.IllegalStateException: 在onSaveInstanceState之后不能执行这个 Action

标签 java android android-fragments android-permissions

<分区>

我正在尝试获取读取日历的权限,在获取权限后我正在尝试调用另一个 fragment 。我遇到以下异常。这仅在首次启动应用程序时发生。对于下一次启动应用程序,它工作正常。

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.access$1600(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.access$1600(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) 

这是我的代码

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

}

最佳答案

如果您在 fragment Activity 的 onSaveInstanceState() 被调用后尝试执行 fragment 转换,则会发生此异常。

要测试这里是否是这种情况,请重写 onSaveInstanceState(),这样它就不会调用 super 方法。

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

如果这解决了问题,请使用 commitAllowingStateLoss();

代替 fragment 管理器上的 commit()

关于java - Caused by : java. lang.IllegalStateException: 在onSaveInstanceState之后不能执行这个 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40267990/

相关文章:

java - 如何将 vector 元素转换为逗号分隔的字符串

java - 即使在调试和测试中检查错误后,我的 android 应用程序仍然崩溃

android - NavController.popBackStack 似乎创建了一个新的 fragment 实例

android - 滚动时 fragment 内容隐藏在 BottomNavigationView 后面

java - 如何控制 Java Futures 为 "submitted"的订单?

java - 我们可以在 Java 的 Maven 构建过程中进行 bash 测试吗?

java - 如何将 ASP.NET Identity 用户移植到 Java Servlet

android - android SDK中的target SDK选项必须与测试设备Android版本相同吗? (Android SDK基础)

java - pointerIndex 超出范围 Android 多点触控

android - 如何使用 Fragment 显示 ProgressDialog