¿Por qué no usar siempre android: configChanges= "keyboardHidden / orientation"?


Me preguntaba por qué no usar android:configChanges="keyboardHidden|orientation" en cada (casi cada ;)) actividad?

Mercancías:

  • no hay necesidad de preocuparse por la rotación de su actividad
  • es más rápido

No es tan agradable:

  • necesita cambiar sus diseños si dependen del tamaño de la pantalla (por ejemplo, diseños con dos columnas más o menos)

Malo:

  • no hay una forma flexible de tener diferentes diseños en diferentes orientaciones
  • no es tan bueno cuando se usa fragmentos

Pero si no usamos diferentes diseños, ¿por qué no?

Author: Thierry-Dimitri Roy, 2011-10-19

4 answers

Fondo rápido

De forma predeterminada, cuando se producen ciertos cambios de configuración de claves en Android (un ejemplo común es un cambio de orientación), Android reinicia completamente la actividad en ejecución para ayudarlo a ajustarse a dichos cambios.

Cuando defines android:configChanges="keyboardHidden|orientation" en tu AndroidManifest, le estás diciendo a Android: "Por favor, no hagas el reinicio predeterminado cuando se saca el teclado, o el teléfono gira; quiero manejar esto yo mismo. Sí, sé lo que estoy haciendo"

¿Es esto algo bueno? Nos pronto lo veremos...

Sin preocupaciones?

Uno de los pros con los que comienzas es que hay:

No hay necesidad de preocuparse por la rotación de su actividad

En muchos casos, las personas creen erróneamente que cuando tienen un error que está siendo generado por un cambio de orientación ("rotación"), simplemente pueden arreglarlo poniendo android:configChanges="keyboardHidden|orientation".

Sin embargo, android:configChanges="keyboardHidden|orientation" no es más que un bandaid. En verdad, hay muchas maneras se puede activar un cambio de configuración. Por ejemplo, si el usuario selecciona un nuevo idioma (es decir, la configuración regional ha cambiado), su actividad se reiniciará de la misma manera que lo hace mediante un cambio de orientación. Si lo desea, puede ver una lista de todos los diferentes tipos de cambios de configuración.

Editar: Lo más importante, sin embargo, como hackbod señala en los comentarios, su actividad también se reiniciará cuando su aplicación esté en segundo plano y Android decida liberar un poco de memoria matándolo. Cuando el usuario regrese a tu aplicación, Android intentará reiniciar la actividad de la misma manera que lo hace si hubo algún otro cambio de configuración. Si no puedes manejar eso, el usuario no estará contento...

En otras palabras, usar android:configChanges="keyboardHidden|orientation" no es una solución para sus "preocupaciones"."La forma correcta es codificar sus actividades para que estén contentos con cualquier reinicio Android lanza en ellos. Esta es una buena práctica que te ayudará en el camino, así que acostúmbrate a se.

Entonces, ¿cuándo debo usarlo?

Como usted mencionó, hay una clara ventaja. Sobrescribir el cambio de configuración predeterminado para una rotación manejándolo usted mismo acelerará las cosas. Sin embargo, esta velocidad viene con un precio de conveniencia.

En pocas palabras, si usa el mismo diseño tanto para retrato como para paisaje, está en buena forma al sobrescribir. En lugar de una recarga completa de la actividad, las vistas simplemente cambiarán para llenar el espacio restante.

Sin embargo, si por alguna razón usas un diseño diferente cuando el dispositivo está en horizontal, el hecho de que Android vuelva a cargar tu actividad es bueno porque luego cargará el diseño correcto. [Si usa el override en una actividad de este tipo, y desea hacer un rediseño mágico en tiempo de ejecución... bueno, buena suerte-está lejos de ser simple]

Resumen rápido

Por todos los medios, si android:configChanges="keyboardHidden|orientation" es adecuado para ti, entonces úsalo. Pero POR FAVOR asegúrese de probar qué sucede cuando algo cambia, porque un cambio de orientación no es la única forma en que se puede activar un reinicio de actividad completo.

 304
Author: yydl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:28

Desde mi punto de vista: Si el diseño es el mismo tanto en modo horizontal como vertical, también puede desactivar uno de los dos en su aplicación.

La razón por la que declaro esto es que yo como usuario espero que la aplicación me proporcione algún beneficio, cuando cambio de orientación. Si no importa cómo sostengo mi teléfono, entonces no necesito la opción.

Tome por ejemplo una aplicación donde tiene una vista de lista, y al hacer clic en un ListItem desea que se le muestre una vista detallada de ese elemento. En horizontal, dividiría la pantalla en dos, teniendo la vista de lista a la izquierda y la vista detallada a la derecha. En Retrato tendría la lista en una pantalla y luego cambiaría la pantalla a la vista detallada cuando se selecciona un ListItem. En ese caso, el cambio de orientación tiene sentido, así como diferentes diseños.

 2
Author: kaspermoerch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-19 08:58:50

No veo por qué.... los reinicios ocasionales están bien en mi opinión... configChanges maneja la mayoría de los casos por mí... bueno, tal vez en algunos tipos de aplicaciones esto puede ser un problema, pero depende realmente del tipo de aplicación y cómo restaurar el estado cuando se reinicia la aplicación... Cuando una de mis aplicaciones se reinicia, el usuario vuelve a iniciar sesión y la última actividad se abre con mi código y el usuario pierde algunos pasos para volver a donde estaba, pero no es gran cosa.. En otros, algún estado siempre se mantiene y algún estado siempre se restaura al reiniciar. Cuando la actividad se reinició tuvo que ser que la aplicación no se ha utilizado o algo así... así que no hay problema en absoluto... En el juego, por ejemplo, esto puede ser un problema tal vez o en algún otro tipo de aplicación que no conozco...

Digo que cuando lo haces de esta manera, las aplicaciones funcionan bien en circunstancias normales. Y el código es mucho más legible sin tonelada de lógica necesaria para guardar y restaurar donde u solo puede hacer nuevos errores y tener que mantenerlo todo el tiempo... seguro que si Android sale del poder y matar la ventana de la aplicación pierde el contexto y comienza de nuevo, pero esto sucede solo en situaciones especiales y en dispositivos más nuevos Creo que esto es cada vez más raro...

Así que mátame, pero uso esto en todas las aplicaciones con bastante éxito... android:configChanges="locale|keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" Pero entiendo que para algún tipo especial de aplicaciones puede no ser una buena manera, pero la mayoría de las aplicaciones pueden vivir con esto simplemente bien.

 -1
Author: Renetik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-08 02:09:05

Sí, creo que hacer una pausa hará que sea más rápido que liberar al jugador. Todavía tengo la pausa sin embargo.

Ahora han encontrado una solución que no pausará la canción.

Indique en el manifiesto que manejará el cambio de configuración para la orientación de la pantalla y luego use el método onConfigurationChanged para cargar el archivo de diseño. Al hacer esto en logCat puedo ver que onPause, onCreate y onResume no se llaman, y por lo tanto la canción no se detiene.

  1. Actualizar el manifiesto a encárgate de la orientación.

    android:configChanges="orientation|screenSize"
    
  2. Añadir este código

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }
    
 -3
Author: Raul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-25 07:34:40