DialogFragment Orientación Cambiar el bloqueo con getActivity ()

Actualmente tengo algunos problemas con DialogFragments. Estoy utilizando 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 diálogo está abierto, la aplicación comienza a actuar extraño.

Actualmente mi aplicación funciona de esta manera: Hay una FragmentActivity, que llama un Fragmento. Este Fragmento entonces llama a DialogFragment (vía getActivity (). GetSupportFragmentManager ().

Si la orientación cambia mientras el diálogo está abierto, getActivity () en el Fragmento = nulo. Esto causa un problema si quiero terminar la Actividad, etc.

Para provocar esto, abra el 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: com.example.TestBed.TestBedActivity@hexnumber * With crash equals: null */ Log.e("TestBedFragment", "getActivity() = " + getActivity()); // Will equal null... ??? getActivity().finish(); } } 

No estoy muy seguro de lo que está causando esto? 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 esas cosas en logcat.

¿Puede alguien ayudarme 🙂 Su muy apreciado

Gracias

Usted tiene que entender el ciclo de vida de la actividad. Cada vez que gira el dispositivo, la actividad se vuelve a crear. Significa que se está ejecutando una nueva instancia de la clase.

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

Usted llama a getActivity ya no es válido.

¿No puedes cerrar tu diálogo abierto durante el método fragment onDestroy?

Puede descartar su diálogo en onPause () y usar un condicional para comprobar 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(); } 

Estás recreando todo en lugar de usar el paquete. Agregue un if a su onCreateDialog para comprobar si hay un paquete nulo. Si es nulo, haz tus cosas de creación, de lo contrario no hará nada y Android restaurará todo del paquete.

Creo que esto solucionará el problema.

 if(SavesIinstanceState == null); { // your code } 
  • Visualización de imágenes de la tarjeta sd en gridview android
  • Odroid-XU4 Android orientación a pantalla completa
  • Android onConfigurationChanged () no se llama en Actividad
  • La orientación del dispositivo Android es Paisaje, pero los sensores se comportan como si la orientación fuera Retrato
  • Cómo utilizar SensorManager.getOrientation () en lugar de TYPE_ORIENTATION
  • La dirección de la brújula es diferente dependiendo de la orientación del teléfono
  • Administrar el diseño dentro de un radiogrupo horizontal orientado
  • Comportamiento extraño de las medidas del campo magnético mientras gira el dispositivo
  • Cómo obtener el ancho de ventana correcto en el cambio de orientación para dispositivos Android, tabletas y móviles
  • Android Quiero obtener ángulo de rotación para el dispositivo
  • Problema con la orientación personalizada de la imagen de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.