2012-05-10 26 views
5

Actualmente tengo algunos problemas con DialogFragments. Estoy usando los últimos paquetes de soporte v.4 (Revisión 8, creo) Mi problema es que si la orientación de mi teléfono cambia mientras el cuadro de diálogo está abierto, la aplicación comienza a actuar de manera extraña.DialogFragment Orientation Change Crash with getActivity()

Actualmente mi aplicación funciona así: Hay una FragmentActivity, llama a un Fragment. este fragmento a continuación, llama a un DialogFragment (a través de getActivity(). GetSupportFragmentManager().

Si los cambios de orientación, mientras que el diálogo está abierto, el getActivity() en el fragmento = null. Esto causa un problema si quiero termina la actividad etc.

para causar este se abre el cuadro de diálogo, cambie la orientación y presione un botón Sólo después de pulsar el botón se bloquea

Mi DialogFragment se llama AlertDialogFragment:.

public class AlertDialogFragment extends DialogFragment { 
private static Builder mBuilder; 
private static DialogInterface.OnClickListener mListener; 

public static AlertDialogFragment newInstance(Context context, DialogInterface.OnClickListener listener) { 
    mBuilder = new AlertDialog.Builder(context); 
    mListener = listener;  
    return new AlertDialogFragment(); 
} 

//... some functions to set Icons etc 

public void setButton(int whichButton, CharSequence buttonText) { 
    final DialogInterface.OnClickListener listener = mListener == null ? null : mListener;  
    mBuilder.setPositiveButton(buttonText, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       listener.onClick(dialog, whichButton); 
      } 
    }); 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    return mBuilder.create(); 
} 
} 

Este es el fragmento:

public class TestBedFragment extends Fragment implements DialogInterface.OnClickListener { 
// onCreateView Stuff 

private void showCrashDialog() { 
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    AlertDialogFragment newDialog = AlertDialogFragment.newInstance(getActivity(), this); 
    newDialog.setTitle("Test");  
    newDialog.setIcon(android.R.drawable.ic_dialog_alert); 
    newDialog.setMessage("Testing testing testing... 1, 2, 3... Just press Ok."); 
    newDialog.setButton(DialogInterface.BUTTON_POSITIVE, "Ok"); 
    newDialog.show(ft, "dialog"); 

    // Cause the problem. Simulate the user turning the screen 
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
} 

@Override 
public void onClick(DialogInterface dialog, int which) { 

    /* 
    * hexnumber = a hex number 
    * Normally equals: TestBedFragment{hexnumber #0 id=hexnumber} 
    * With crash equals: TestBedFragment{hexnumber} 
    */ 
    Log.e("TestBedFragment", "this = " + this); 

    /* 
    * hexnumber = a hex number 
    * Normally equals: [email protected] 
    * With crash equals: null 
    */ 
    Log.e("TestBedFragment", "getActivity() = " + getActivity()); // Will equal null... ??? 

    getActivity().finish(); 
} 
} 

No estoy muy seguro de cuál es la causa? Lo siento si es una pregunta estúpida. He leído en otros lugares sobre 'Windows Leaking', pero no he visto ninguna mención de eso en Logcat.

¿Puede alguien ayudarme :) Sus muy apreciados

Gracias

Respuesta

0

vuelve a crear todo lo que en lugar de utilizar el paquete. Agregue if a su onCreateDialog para buscar un paquete nulo. Si es nulo, haga lo de su creación, de lo contrario no hará nada y Android restaurará todo del paquete.

Creo que solucionará su problema.

if(SavesIinstanceState == null); { 
    // your code 
} 
1

Tienes que comprender el ciclo de vida de la actividad. Cada vez que gira el dispositivo, la actividad se recrea. Significa que se está ejecutando una nueva instancia de la clase.

Lo que ocurre en su código es que, después de una rotación, el oyente llama a getActivity en una instancia de diálogo anterior, refiriéndose a la actividad anterior. Pero esta actividad ya no es válida, ha sido "destruida" después de la rotación y apareció una nueva.

Llamar a getActivity ya no es válido.

¿No puedes cerrar el cuadro de diálogo abierto durante el fragmento en el método Destroy?

1

Puede descartar su diálogo en onPause() y usar un condicional para verificar y mostrar() el diálogo en onCreate(). Esto puede ser más apropiado en onStop() o onDestroy() dependiendo de su caso de uso específico.

@Override 
protected void onPause() { 
    if (myDialog != null && myDialog.isVisible()) 
     myDialog .dismiss(); 
    super.onPause(); 
}