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.

  • Abrir archivo en el directorio de caché con ACTION_VIEW
  • Cómo mostrar brindis en AsyncTask en doInBackground
  • Cambiar el color de fondo de la barra de herramientas por programa no cambia Título de barra de herramientas Color de fondo
  • Conceder permisos de sistema a una aplicación en el emulador de Android
  • Ajuste automático de TextView para Android
  • ¿Relativelayout o LinearLayout en el desarrollo de ios iphone?
  • 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.

  • Agregar distancia a una coordenada GPS
  • ¿Cómo insertar un log en LogCat que cuando hago clic en salta a su línea en el código?
  • ¿Cómo conectar la aplicación de Android a la base de datos MySQL?
  • Actividad de Android dentro del cuadro de diálogo
  • ¿Puede la carpeta Diseño de Android contener subcarpetas?
  • CertPathValidatorException: Ancla de confianza para ruta de certificación no encontrada
  • 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.