2012-08-05 16 views
5

Tengo un DialogFragment que se suponía que era simple, pero me está dando algunos grandes problemas específicamente en Jelly Bean.DialogFragment bloquea la actividad al llamar a startActivity()

La aplicación utiliza la red y aparece un diálogo que le pide al usuario que active el WiFi o lo cancele y luego lo cierra. Por lo tanto, se extiende y crea DialogFragment Ver como:

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

Si el usuario hace clic en Sí, se descarta el diálogo y abre la actividad de configuración inalámbrica. O si el usuario hace clic Cancelar simplemente cierra toda mi actividad, pero en Jelly Bean, en cualquier momento que haga clic en Sí, lo hace abrir los ajustes, pero la fuerza de aplicación se cierra con el siguiente error:

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) 

Hay un poco de registro adicional que muestra el estado guardado de cada fragmento que estaba en mi disposición y el número 2 que se supone que es el SettingsDialogFragment es sólo un null:

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

traté de no descartar el diálogo, pero se estrelló la misma manera.

No estoy seguro de qué está pasando aquí ... ¿Alguna idea?


EDIT:

el código de actividad (que es una actividad normal debido a que la aplicación está destinada a ICS en adelante):

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

¿Podría poner todo el código relevante en una PasteBin? El error también podría estar en su 'FragmentActivity'. – tolgap

+0

@tolgap Tengo dos métodos simples en mi actividad, los acabo de incluir en la publicación. La actividad llama a uno u otro en devoluciones de llamada desde el API y dimisses OnPause() – Budius

+0

Interesante, uno más de esos fragmentos no comprensibles IllegalStateExceptions ... Pensé que ya había visto todo. – Ixx

Respuesta

7

Al parecer, Google cambió algo de ICS a JB y para descartar el Diálogo que tuve que usar:

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

Parece que el diálogoFrag no se está eliminando del gestor de fragmentos OnDismiss como solía hacerlo, si alguien se preocupa por profundizar en el código fuente y verificar la comunidad, sería estupendo.

gracias.

Cuestiones relacionadas