2016-10-26 13 views
1

私は別のフラグメントを呼び出そうとしている権限を取得した後、カレンダーを読むためのアクセス権を取得しようとしています。私は次の例外で立ち往生しています。これは、アプリケーションの最初の起動時にのみ発生します。次の起動アプリケーションでは正常に動作します。あなたのフラグメントの活動のonSaveInstanceState()が呼び出される後のフラグメントの移行を実行しようとした場合原因:java.lang.IllegalStateException:onSaveInstanceStateの後にこのアクションを実行できません。

5488-5488/com.mindtree.calenderevents E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.mindtree.calenderevents, PID: 5488 
java.lang.RuntimeException: Failure delivering result ResultInfo{[email protected]: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(); 
     } 
    } 

} 

答えて

5

でこの例外が発生します。

ここに該当するかどうかをテストするには、onSaveInstanceState()をオーバーライドしてsuperメソッドを呼び出さないようにします。

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

これはあなたがAsyncTask(またはスレッド)を持っている場合、この問題が発生した主な理由の一つは、あることをcommitAllowingStateLoss();

+1

注意を使用し、あなたのフラグメントマネージャに代わりcommit()の、問題を修正した場合アクティビティランニング停止します。この場合、onSavedInstanceState()を正しく処理するようにしてください – Shadesblade

関連する問題