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();
}
Potresti inserire tutto il codice rilevante in un PasteBin? L'errore potrebbe essere anche nel tuo 'FragmentActivity'. – tolgap
@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
Interessante, un altro di quei frammenti non comprensibili IllegalStateExceptions ... Pensavo di aver già visto tutto. – Ixx