2012-08-05 12 views
5

Ho uno DialogFragment che doveva essere semplice ma mi sta causando alcuni grossi problemi nello specifico su Jelly Bean.DialogFragment arresta l'attività quando chiama startActivity()

L'app utilizza la rete e apre una finestra di dialogo che chiede all'utente di attivare il WiFi o annullare, quindi di chiuderlo. Così si estende DialogFragment e crea Vedi come:

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

Se l'utente fa clic su Sì, ha respinto il dialogo e si apre l'attività impostazioni Wireless. O se l'utente sceglie Annulla solo chiude tutta la mia attività, ma su Jelly Bean, in qualsiasi momento clicco Sì, lo fa aprire le impostazioni, ma la forza app si chiude con il seguente errore:

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) 

C'è un po 'di registrazione in più che mostra lo stato salvato di ogni frammento che era sul mio layout e il numero 2 che avrebbe dovuto essere il SettingsDialogFragment è solo un null:

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

ho cercato di non respingere il dialogo, ma è caduto nello stesso modo.

Non sono davvero sicuro di cosa sta succedendo qui ... Qualche idea?


EDIT:

il codice attività (si tratta di una normale attività, perché il target app ICS in su):

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

Potresti inserire tutto il codice rilevante in un PasteBin? L'errore potrebbe essere anche nel tuo 'FragmentActivity'. – tolgap

+0

@tolgap Ho due metodi semplici sulla mia attività, li ho appena inclusi nel post. L'attività chiama l'uno o l'altro sui callback dall'API e dalle dimisses OnPause() – Budius

+0

Interessante, un altro di quei frammenti non comprensibili IllegalStateExceptions ... Pensavo di aver già visto tutto. – Ixx

risposta

7

A quanto pare Google ha cambiato qualcosa da ICS a JB e per chiudere la dialogo che dovevo usare:

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

Sembra che il dialogFrag non si sta rimuovendo dal gestore dei frammenti OnDismiss come una volta, se qualcuno si preoccupa di scavare nel codice sorgente e ricontrollare la comunità, sarebbe super.

grazie.

Problemi correlati