2012-08-05 4 views
5

Ich habe eine DialogFragment, die eigentlich einfach sein sollte, aber es gibt mir einige große Probleme speziell bei Jelly Bean.DialogFragment stürzt ab Aktivität beim Aufrufen von startActivity()

Die App nutzt das Netzwerk und es erscheint ein Dialog, in dem der Benutzer aufgefordert wird, WiFi einzuschalten oder abzubrechen und dann zu schließen. So reicht es DialogFragment und schafft Ansicht als:

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

Wenn der Benutzer Ja klickt, den Dialog und öffnet die Wireless-Einstellungen Aktivität entlässt. Oder, wenn der Benutzer auf Abbrechen klickt es nur meine ganze Tätigkeit schließt, aber auf Jelly Bean, zu jeder Zeit ich Ja klicken, wird es die Einstellungen öffnen, aber die App Kraft schließt mit dem folgenden Fehler:

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) 

Es gibt einige zusätzliche Protokollierung den gespeicherten Zustand jedes Fragments zeigt, die 2 auf meinem Layout und die Zahl war, dass die SettingsDialogFragment ist nur ein null sein sollte:

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

ich habe versucht, den Dialog nicht zu entlassen, aber es stürzte auf die gleiche Weise.

Ich bin wirklich nicht sicher, was hier los ist ... Irgendwelche Ideen?


EDIT:

Der Code Aktivität (es ist eine normale Aktivität, da die App Ziele ICS und höher):

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

Könnten Sie alle relevanten Code in eine PasteBin einfügen? Der Fehler könnte auch in Ihrer 'FragmentActivity' liegen. – tolgap

+0

@tolgap Ich habe zwei einfache Methoden auf meiner Aktivität, ich habe sie einfach in den Beitrag aufgenommen. Die Aktivität ruft die eine oder andere Callbacks von der API und Dimisses OnPause() – Budius

+0

Interessant, eine weitere dieser nicht verständlichen Fragment IllegalStateExceptions ... Ich dachte, ich hätte alles schon gesehen. – Ixx

Antwort

7

Offenbar Google etwas von ICS zu JB geändert und die entlassen Dialog musste ich verwenden:

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

Es scheint, dass der DialogFrag Wenn sich jemand in den Quellcode vertieft und nach der Community sucht, wäre das super.

danke.