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 ().
- ¿Cómo no guardar el estado de la vista en Android?
- GetRotationMatrix y tutorial de getOrientation
- Las imágenes tomadas con ACTION_IMAGE_CAPTURE siempre devuelven 1 para ExifInterface.TAG_ORIENTATION en algunos dispositivos más nuevos
- La mejor práctica para manejar el cambio de orientación: Android
- La aplicación se bloquea después de cambiar la orientación de la pantalla
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
- Aplicación de Android que pierde datos durante el cambio de orientación
- Orientación de Android AR
- Android, ¿cómo no destruir la actividad cuando giro el dispositivo?
- OnSurfaceCreated () se llama cambios de orientación cada vez
- ¿Cómo conservar la instancia de fragmento de fragmento de reproducción de vídeo después de un cambio de orientación?
- Cómo hacer que el diseño de Android sea proporcional independientemente del tamaño de la pantalla y la orientación
- Orientación de la pantalla de Android
- ¿El error de AdView causó que todas las vistas de la Web dejen de cargarse cuando cambia la orientación y se están ejecutando múltiples subprocesos?
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 }
- Construcción de perfiles Sip: Android
- Cómo utilizar correctamente claves foráneas en Android, utilizando SQLite y OrmLite