2012-08-05 154 views
5

我有一個DialogFragment本應該是簡單的,但它給了我特別是對Jelly Bean的一些大問題。DialogFragment崩潰調用startActivity()時的活動()

該應用程序使用網絡,它彈出一個對話框,要求用戶打開WiFi或取消然後關閉它。因此,它擴展DialogFragment和創建視圖:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    AlertDialog a = new AlertDialog.Builder(getActivity()).setCancelable(true).setTitle(R.string.dialog_title_disabled) 
      .setMessage(R.string.dialog_text) 
      .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         dismiss(); 
         Intent i = new Intent(Settings.ACTION_WIRELESS_SETTINGS); 
         i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         startActivity(i); 
        } 
      }).setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         getActivity().finish(); 
        } 
      }).create(); 
    //a.setCanceledOnTouchOutside(false); 
    return a; 
} 

如果用戶點擊是,它否定了對話,並打開無線設置活動。或者,如果用戶點擊取消它只是關閉我的整個活動,但是在果凍豆,只要我單擊是,它並打開設置,但應用程序的作用下與以下錯誤關閉:

08-05 20:24:22.584: E/AndroidRuntime(2579): java.lang.IllegalStateException: Failure saving state: active SettingsDialogFragment{425dd550} has cleared index: -1 
08-05 20:24:22.584: E/AndroidRuntime(2579):  at android.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1653) 

有一些額外的記錄顯示出在我的佈局,這應該是SettingsDialogFragment 2號的每個片段的保存狀態只是一個null

08-05 20:24:22.576: E/FragmentManager(2579):  #2: null 

我想不排除在對話,但它墜毀相同的方式。

我真的不知道這裏發生了什麼......任何想法?


編輯:

活動代碼(這是一種正常的活動,因爲該應用程序的目標ICS及以上):

private void showDialog() { 
    SettingsDialogFragment diag = (SettingsDialogFragment) getFragmentManager().findFragmentByTag(DIALOG_TAG); 
    if (diag == null) { 
     diag = new SettingsDialogFragment(); 
     diag.show(getFragmentManager(), DIALOG_TAG); 
    } else { 
     if (!diag.isVisible()) 
      diag.show(getFragmentManager(), DIALOG_TAG); 
    } 
} 

private void dismissDialog() { 
    SettingsDialogFragment diag = (SettingsDialogFragment) getFragmentManager().findFragmentByTag(DIALOG_TAG); 
    if (diag != null) 
     diag.dismiss(); 
} 
+0

你能把所有相關的代碼放到一個PasteBin中嗎?這個錯誤也可能在你的'FragmentActivity'中。 – tolgap 2012-08-05 20:49:31

+0

@tolgap我在我的Activity上有兩個簡單的方法,我只是將它們包含在帖子中。該活動調用一個或另一個來自API的回調函數和dimPses OnPause() – Budius 2012-08-05 22:48:42

+0

有趣的是,更多的那些不可理解的片段IllegalStateExceptions ...我以爲我已經看到了所有。 – Ixx 2012-08-05 23:19:43

回答

7

顯然,谷歌改變從ICS東西JB和駁回對話我不得不使用:

dismiss(); 
getFragmentManager().beginTransaction().remove(frag).commit(); 

看來,dialogFrag如果有人在意挖掘源代碼並仔細檢查通信代碼,它就不會像過去那樣從片段管理器OnDismiss中移除它,它會超級。

謝謝。