Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Evitar el descarte de diálogo en la rotación de la pantalla en Android

Estoy tratando de evitar que los diálogos creados con Alert Builder sean rechazados cuando se reinicie la actividad.

Si sobrecarga el método onConfigurationChanged puedo hacer esto con éxito y restablecer el diseño para corregir la orientación, pero pierdo la función de texto pegajoso de edittext. Así que en la solución del problema de diálogo he creado este problema edittext.

  • Cómo capturar el evento de prensa larga para el elemento Listeview de un ListActivity?
  • ¿Cómo debo codificar para resistir la "piratería con un solo clic"?
  • Custom getFilter en ArrayAdapter personalizado en android
  • Android Listview - no puede seleccionar varios elementos cuando usa un cursor
  • Diferencia entre res / color y res / values ​​/ colors.xml en la carpeta de recursos de Android
  • Android Añadir imagen al texto (en la vista de texto)?
  • Si guardo las cadenas de la edittext y las reasigno en el cambio de onCofiguration todavía parecen fallar al valor inicial no lo que fue introducido antes de la rotación. Incluso si forzar un invalidate parece actualizarlos.

    Realmente necesito resolver el problema del diálogo o el problema edittext.

    Gracias por la ayuda.

  • Android: Usar el estilo predeterminado en un título de diálogo personalizado
  • Android WebView setCertificate emite problemas de SSL
  • Android Studio No se puede ejecutar AVD
  • ¿Cómo obtener los registros de fallos de Android?
  • Divide la cadena en la última aparición del carácter
  • Cómo eliminar el relleno de Android CheckBox
  • 8 Solutions collect form web for “Evitar el descarte de diálogo en la rotación de la pantalla en Android”

    La mejor manera de evitar este problema hoy en día es utilizando un DialogFragment .

    Cree una nueva clase que DialogFragment . onCreateDialog y devuelve tu antiguo Dialog o un AlertDialog .

    A continuación, puede mostrarlo con DialogFragment.show(fragmentManager, tag) .

    He aquí un ejemplo con un Listener :

     public class MyDialogFragment extends DialogFragment { public interface YesNoListener { void onYes(); void onNo(); } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (!(activity instanceof YesNoListener)) { throw new ClassCastException(activity.toString() + " must implement YesNoListener"); } } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setTitle(R.string.dialog_my_title) .setMessage(R.string.dialog_my_message) .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ((YesNoListener) getActivity()).onYes(); } }) .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ((YesNoListener) getActivity()).onNo(); } }) .create(); } } 

    Y en la Actividad que usted llama:

     new MyDialogFragment().show(getSupportFragmentManager(), "tag"); // or getFragmentManager() in API 11+ 

    Esta respuesta mezcla estas tres preguntas (y sus respuestas):

    • Android Mejor forma de evitar Diálogos para descartar después de una rotación del dispositivo
    • DialogFragment de Android vs Diálogo
    • ¿Cómo puedo mostrar un DialogFragment usando el paquete de compatibilidad?
     // Prevent dialog dismiss when orientation changes private static void doKeepDialog(Dialog dialog){ WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); lp.copyFrom(dialog.getWindow().getAttributes()); lp.width = WindowManager.LayoutParams.WRAP_CONTENT; lp.height = WindowManager.LayoutParams.WRAP_CONTENT; dialog.getWindow().setAttributes(lp); } 
     public static void doLogout(final Context context){ final AlertDialog dialog = new AlertDialog.Builder(context) .setIcon(android.R.drawable.ic_dialog_alert) .setTitle(R.string.titlelogout) .setMessage(R.string.logoutconfirm) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ... } }) .setNegativeButton("No", null) .show(); doKeepDialog(dialog); } 

    Si está cambiando el diseño en el cambio de orientación, no pondría android:configChanges="orientation" en su manifiesto porque está recreando las vistas de todos modos.

    Guarda el estado actual de tu actividad (como texto introducido, diálogo mostrado, datos mostrados, etc.) usando estos métodos:

     @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); } 

    De esta forma, la actividad pasa a través de la opción Crear de nuevo y después llama al método onRestoreInstanceState donde puede volver a establecer el valor de EditarTexto.

    Si desea almacenar objetos más complejos, puede utilizar

     @Override public Object onRetainNonConfigurationInstance() { } 

    Aquí puede almacenar cualquier objeto y en onCreate sólo tienes que llamar a getLastNonConfigurationInstance(); Para obtener el objeto.

    Un acercamiento muy fácil es crear los diálogos del método onCreateDialog() (véase la nota abajo). Se muestran a través de showDialog() . De esta manera, Android maneja la rotación para usted y no tiene que llamar a onPause() en onPause() para evitar un WindowLeak y luego no tiene que restaurar el diálogo. De los documentos:

    Mostrar un diálogo administrado por esta actividad. Una llamada a onCreateDialog (int, Bundle) se realizará con el mismo id la primera vez que se llame a un id dado. A partir de entonces, el diálogo se guardará y restaurará automáticamente.

    Vea Android docs showDialog () para más información. Espero que ayude a alguien!

    Nota: Si utiliza AlertDialog.Builder, no llame a show() desde onCreateDialog() , llame a create() . Si utiliza ProgressDialog, simplemente cree el objeto, establezca los parámetros que necesita y devuélvalos. En conclusión, show() dentro onCreateDialog() causa problemas, sólo cree la instancia Dialog y devuélvala. ¡Esto debería funcionar! (He experimentado problemas usando showDialog () de onCreate () -actualmente no se muestra el diálogo-, pero si lo usas en onResume () o en una llamada de escucha, funciona bien).

    Esta pregunta fue contestada hace mucho tiempo.

    Sin embargo, esta es la solución no hacky y simple que uso para mí.

    Hice esta clase de ayuda para mí mismo, así que usted puede utilizarla en su aplicación también.

    El uso es:

     PersistentDialogFragment.newInstance( getBaseContext(), RC_REQUEST_CODE, R.string.message_text, R.string.positive_btn_text, R.string.negative_btn_text) .show(getSupportFragmentManager(), PersistentDialogFragment.TAG); 

    O

      PersistentDialogFragment.newInstance( getBaseContext(), RC_EXPLAIN_LOCATION, "Dialog title", "Dialog Message", "Positive Button", "Negative Button", false) .show(getSupportFragmentManager(), PersistentDialogFragment.TAG); public class ExampleActivity extends Activity implements PersistentDialogListener{ @Override void onDialogPositiveClicked(int requestCode) { switch(requestCode) { case RC_REQUEST_CODE: break; } } @Override void onDialogNegativeClicked(int requestCode) { switch(requestCode) { case RC_REQUEST_CODE: break; } } } 

    Puede combinar los métodos onSave / onRestore del Diálogo con los métodos onSave / onRestore de la Actividad para mantener el estado del Diálogo.

    Nota: Este método funciona para aquellos "sencillos" cuadros de diálogo, como mostrar un mensaje de alerta. No reproducirá el contenido de un WebView incrustado en un cuadro de diálogo. Si realmente desea evitar un diálogo complejo de despido durante la rotación, pruebe el método de Chung IW.

      @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); myDialog.onRestoreInstanceState(savedInstanceState.getBundle("DIALOG")); // Put your codes to retrieve the EditText contents and // assign them to the EditText here. } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // Put your codes to save the EditText contents and put them // to the outState Bundle here. outState.putBundle("DIALOG", myDialog.onSaveInstanceState()); } 

    Simplemente añada android: configChanges = "orientación" con su elemento de actividad en AndroidManifest.xml

    Ejemplo:

     <activity android:name=".YourActivity" android:configChanges="orientation" android:label="@string/app_name"></activity> 

    Solo usa

     ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize 

    Y la aplicación sabrá cómo manejar la rotación y el tamaño de la pantalla.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.