Pantalla de Android android:screenOrientation configLos cambios cambian dinámicamente las pantallas horizontales y verticales al procesar el código de cambio de configuración

Mostrar relacionados

orientación de la pantalla

https://developer.android.com/reference/android/content/res/Configuration.html#orientation
Las diferencias específicas son las siguientes:

Activity.getResources().getConfiguration().orientation obtiene el valor real de orientación de la pantalla del dispositivo actual, que se puede cambiar dinámicamente según la rotación del dispositivo o la operación del usuario. Por ejemplo, cuando el usuario gira el dispositivo de vertical a horizontal, el valor de orientación obtenido cambia en consecuencia.

La orientación configurada en el Manifiesto se utiliza para especificar la orientación predeterminada de la actividad, es decir, la orientación en la que se debe mostrar la actividad cuando no hay otros factores que la afecten. Puede tener los siguientes valores:

retrato: Orientación vertical (vertical).
paisaje: Orientación horizontal (pantalla horizontal).
Sensor: ajusta automáticamente la orientación según la rotación del dispositivo.
Usuario: Ajusta automáticamente la orientación según las preferencias del usuario.

Esta configuración se puede establecer en la etiqueta del archivo de manifiesto. Sin embargo, es sólo un valor predeterminado y la orientación real de la pantalla se verá afectada por otros factores, como la rotación del dispositivo, las acciones del usuario, etc.
Activity.getResources().getConfiguration().orientation obtiene el valor de orientación de la pantalla del dispositivo actual y la orientación configurada en el Manifiesto se utiliza para especificar la orientación predeterminada de la actividad.

En resumen, Activity.getResources().getConfiguration().orientation obtiene el valor de orientación de pantalla real del dispositivo actual, y la orientación configurada en el Manifiesto es la orientación predeterminada de la actividad, pero la orientación real puede variar según el Operaciones del dispositivo y del usuario Cambio.

Orientación de la pantalla de Android

ORIENTATION_UNDEFINED: sin especificar
ORIENTATION_PORTRAIT: vertical
ORIENTATION_LANDSCAPE: horizontal
ORIENTATION_SQUARE: cuadrado

/** Constant for {@link #orientation}: a value indicating that no value has been set. */
public static final int ORIENTATION_UNDEFINED = 0;
/** Constant for {@link #orientation}, value corresponding to the
 * <a href="{@docRoot}guide/topics/resources/providing-resources.html#OrientationQualifier">port</a>
 * resource qualifier. */
public static final int ORIENTATION_PORTRAIT = 1;
/** Constant for {@link #orientation}, value corresponding to the
 * <a href="{@docRoot}guide/topics/resources/providing-resources.html#OrientationQualifier">land</a>
 * resource qualifier. */
public static final int ORIENTATION_LANDSCAPE = 2;
/** @deprecated Not currently supported or used. */
@Deprecated public static final int ORIENTATION_SQUARE = 3;

oficial

android: orientación de pantalla

La orientación de visualización de la actividad en el dispositivo. El sistema ignora este atributo si la actividad se ejecuta en modo de ventanas múltiples. En Android 12 (API nivel 31) y versiones posteriores, los fabricantes de dispositivos pueden configurar pantallas de dispositivos individuales (por ejemplo, pantallas de dispositivos plegables del tamaño de una tableta) para ignorar las especificaciones de orientación y forzar que las aplicaciones estén verticales en modo vertical en modo buzón en modo horizontal. que mantiene la relación de aspecto fija requerida por la aplicación, pero ajusta la orientación de la pantalla de la aplicación para un mejor uso por parte del usuario.

landscape(常用)	屏幕方向为横向(显示的宽度大于高度)。
portrait(常用)	屏幕方向为纵向(显示的高度大于宽度)。
sensor(常用)	屏幕方向由设备方向传感器决定。显示方向取决于用户如何手持设备,它会在用户旋转设备时发生变化。但在默认情况下,一些设备不会旋转为所有四种可能的方向。如要支持所有这四种方向,请使用 "fullSensor"。即使用户锁定基于传感器的旋转,系统仍可使用传感器。
fullSensor(常用)	屏幕方向由使用 4 种方向中任一方向的设备方向传感器决定。这与 "sensor" 类似,不同之处在于无论设备在正常情况下使用哪种方向,该值均支持所有 4 种可能的屏幕方向(例如,一些设备正常情况下不使用反向纵向或反向横向,但其支持这些方向)。API9 新增
unspecified	默认值。由系统选择方向。在不同设备上,系统使用的政策以及基于政策在特定上下文中所做的选择可能会有所差异。
behind	与 Activity 栈中紧接其后的 Activity 的方向相同。
reverseLandscape	屏幕方向是与正常横向方向相反的横向。API9 新增
reversePortrait	屏幕方向是与正常纵向方向相反的纵向。API9 新增
sensorLandscape	屏幕方向为横向,但可根据设备传感器调整为正常或反向的横向。即使用户锁定基于传感器的旋转,系统仍可使用传感器。API9 新增
sensorPortrait	屏幕方向为纵向,但可根据设备传感器调整为正常或反向的纵向。即使用户锁定基于传感器的旋转,系统仍可使用传感器。API9 新增
userLandscape	屏幕方向为横向,但可根据设备传感器和用户首选项调整为正常或反向的横向。API18 新增
userPortrait	屏幕方向为纵向,但可根据设备传感器和用户首选项调整为正常或反向的纵向。API18 新增
nosensor	确定屏幕方向时不考虑物理方向传感器。系统会忽略传感器,因此显示内容不会随用户手持设备的方向而旋转。
user	用户当前的首选方向。
fullUser	如果用户锁定基于传感器的旋转,则其行为与 user 相同,否则,其行为与 fullSensor 相同,并且支持所有 4 种可能的屏幕方向。API18 新增
locked	将屏幕方向锁定为其当前的任意旋转方向。API18 新增

Nota: Si declara uno de los valores horizontal o vertical, el sistema lo considera un requisito estricto para la orientación en la que se ejecuta la actividad. Por lo tanto, los valores que declaras permiten filtrar por servicios como Google Play para que solo los dispositivos que admitan la orientación especificada por la actividad puedan usar tu aplicación. Por ejemplo, si declara "paisaje", "paisaje inverso" o "paisaje sensor", su aplicación solo se podrá utilizar en dispositivos que admitan la orientación horizontal.

Además, debes declarar explícitamente, mediante un elemento como , si tu aplicación requiere orientación vertical u horizontal. Este es un comportamiento de filtrado proporcionado por Google Play (y otros servicios que admiten filtrado), y la plataforma en sí no controla si su aplicación se puede instalar en dispositivos que solo admiten una determinada orientación.

android:configCambios

Enumera los cambios de configuración que la actividad manejará por sí misma. Cuando se produce un cambio de configuración en tiempo de ejecución, la actividad se cierra y se reinicia de forma predeterminada, pero declarar la configuración con este atributo evitará que la actividad se reinicie. En cambio, la actividad permanece ejecutándose y el sistema llama a su método onConfigurationChanged().

Nota: Utilice esta propiedad solo en casos especiales para mejorar el rendimiento y la capacidad de respuesta de la aplicación. Consulte Manejo de cambios de configuración para obtener más detalles.

Las siguientes cadenas son valores válidos para este atributo. Si hay varios valores, utilice | para separarlos, por ejemplo "localización|navegación|orientación".

"densidad" muestra cambios en la densidad, como cuando el usuario especifica una relación de aspecto diferente o cuando hay otra pantalla activa actualmente. Introducido en el nivel API 24.

"fontScale" Cambios en la escala de fuente, como cuando el usuario selecciona un nuevo tamaño de fuente global.
"teclado" Un cambio en el tipo de teclado, como cuando el usuario conecta un teclado externo.
"keyboardHidden" Cambios en la accesibilidad del teclado, como cuando el usuario muestra un teclado de hardware.
"layoutDirection" Cambio de dirección del diseño, por ejemplo, de izquierda a derecha (LTR) a derecha a izquierda (RTL). Introducido en el nivel API 17.
"locale" Cambios de configuración regional, como cuando el usuario selecciona un nuevo idioma para mostrar el texto.
"mcc" El cambio en el código de país móvil (MCC) IMSI cuando el sistema detecta una tarjeta SIM utilizada para actualizar el MCC.
"mnc" El cambio en el código de red móvil (MNC) IMSI cuando el sistema detecta una tarjeta SIM utilizada para actualizar el MNC.
Cambio de TA de "navegación" para el tipo de navegación (bola de seguimiento o teclas de flecha). Normalmente este no es el caso.
"orientación" Un cambio en la orientación de la pantalla, como cuando el usuario gira el dispositivo.

Nota: Si su aplicación está destinada a Android 3.2 (API nivel 13) o superior, también debe declarar las configuraciones "screenLayout" y "screenSize", porque cuando el dispositivo cambia entre los modos vertical y horizontal, el diseño y el tamaño de la pantalla pueden variar.

"screenLayout" El diseño de la pantalla cambia, por ejemplo, cuando se activa otra pantalla.
"screenSize" El cambio del tamaño de pantalla disponible actualmente. Este valor representa el cambio en el tamaño disponible actualmente en relación con la relación de aspecto actual y cambia cuando el usuario cambia entre los modos horizontal y vertical. Introducido en el nivel API 13.
"smallestScreenSize" El tamaño físico de la pantalla cambia. Este valor representa un cambio de tamaño independiente de la orientación, por lo que solo cambia cuando cambia el tamaño físico real de la pantalla, como al cambiar a un monitor externo. Los cambios en esta configuración corresponden a cambios en la configuración de ancho más pequeño. Introducido en el nivel API 13.
"pantalla táctil" Cambia a la pantalla táctil. Normalmente este no es el caso.
El modo de interfaz de usuario "uiMode" cambia, como cuando el usuario coloca el dispositivo sobre una mesa o base para automóvil, o cuando cambia el modo nocturno. Consulte UiModeManager para obtener más información sobre los diferentes modos de UI. Introducido en el nivel API 8.

Todos estos cambios de configuración pueden afectar los valores de recursos que ve la aplicación. Por lo tanto, cuando se llama a onConfigurationChanged(), todos los recursos (incluidos los diseños de vista y los elementos de diseño) normalmente deben recuperarse nuevamente para manejar adecuadamente el cambio.

Nota: Para manejar todos los cambios de configuración relacionados con ventanas múltiples, use "screenLayout" y "smallestScreenSize". Los sistemas Android 7.0 (API nivel 24) o superiores admiten el modo de ventanas múltiples.

Método onConfigurationChanged

inserte la descripción de la imagen aquí
Lo llama el sistema cuando la configuración del dispositivo cambia mientras se ejecuta su actividad. Tenga en cuenta que esto solo se llamará si ha seleccionado android:configChanges que le gustaría manejar con el atributo R.attr.configChanges en su manifiesto. Si se produce algún cambio de configuración que no esté seleccionado para ser informado por ese atributo, entonces, en lugar de informarlo, el sistema detendrá y reiniciará la actividad (para iniciarla con la nueva configuración).
En el momento en que se llame a esta función, su objeto Recursos se habrá actualizado para devolver valores de recursos que coincidan con la nueva configuración.

Método onSaveInstanceState

inserte la descripción de la imagen aquí
** Se llama para recuperar el estado por instancia de una actividad antes de finalizarla para que el estado pueda restaurarse en onCreate(Bundle) o onRestoreInstanceState(Bundle) (el paquete completado por este método se pasará a ambos).

Este método se llama antes de que se pueda finalizar una actividad para que cuando regrese en el futuro pueda restaurar su estado. Por ejemplo, si la actividad B se inicia delante de la actividad A, y en algún momento la actividad A se elimina para recuperar recursos, la actividad A tendrá la oportunidad de guardar el estado actual de su interfaz de usuario a través de este método para que cuando el usuario regrese Para la actividad A, el estado de la interfaz de usuario se puede restaurar mediante onCreate(Bundle) o onRestoreInstanceState(Bundle).

La implementación predeterminada se encarga de la mayor parte del estado de la interfaz de usuario por instancia llamando a View.onSaveInstanceState() en cada vista de la jerarquía que tiene una identificación y guardando la identificación de la vista enfocada actualmente (todo lo cual se restaura). por la implementación predeterminada de onRestoreInstanceState(Bundle)). Si anula este método para guardar información adicional no capturada por cada vista individual, probablemente querrá llamar a la implementación predeterminada; de lo contrario, prepárese para guardar todo el estado de cada vista usted mismo.

Si se llama, este método ocurrirá después de onStop() para aplicaciones dirigidas a plataformas que comienzan con Build.VERSION_CODES.P(28). Para aplicaciones dirigidas a versiones de plataformas anteriores, este método se producirá antes de onStop() y no hay garantías sobre si se producirá antes o después de onPause(). **

Método onRestoreInstanceState

inserte la descripción de la imagen aquí

Este método se llama después de onStart() cuando la actividad se reinicializa desde un estado previamente guardado, que se proporciona aquí en saveInstanceState. La mayoría de las implementaciones simplemente usarán onCreate(Bundle) para restaurar su estado, pero a veces es conveniente hacerlo aquí después de que se haya realizado toda la inicialización o para permitir que las subclases decidan si usar su implementación predeterminada. La implementación predeterminada de este método realiza una restauración de cualquier estado de vista que haya sido previamente congelado por onSaveInstanceState(Bundle).

Este método se llama entre onStart() y onPostCreate(Bundle). Este método sólo se llama cuando se recrea una actividad; el método no se invoca si se llama a onStart() por cualquier otro motivo

Configuración

Manejar cambios de configuración

Algunas configuraciones del dispositivo pueden cambiar mientras la aplicación se está ejecutando. Estos cambios incluyen, entre otros:

  • Tamaño de visualización de la aplicación
  • orientación de la pantalla
  • tamaño y peso de fuente
  • área de idioma
  • Modo oscuro versus modo claro
  • disponibilidad de teclado

La mayoría de estos cambios de configuración fueron provocados por ciertas interacciones del usuario. Por ejemplo, girar o plegar el dispositivo cambia la cantidad de espacio en pantalla disponible para la aplicación. Asimismo, cambiar la configuración del dispositivo, como el tamaño de fuente, el idioma o el tema preferido, cambia los valores correspondientes en el objeto Configuración.

Nota: Conectar y desconectar periféricos y realizar múltiples tareas son escenarios más comunes en dispositivos de pantalla grande, como tabletas, dispositivos plegables o ChromeOS. Estos dispositivos son muy flexibles, por lo que los cambios de configuración se producen con mayor frecuencia.

Estos parámetros suelen requerir cambios sustanciales en la interfaz de la aplicación. Por lo tanto, la plataforma Android proporciona un mecanismo propietario para manejar este cambio. Este mecanismo es la recreación de actividad.

actividad recreada

Cuando ocurre un cambio de configuración, el sistema recrea la Actividad. Para hacer esto, el sistema llama a onDestroy() y destruye la instancia de Actividad existente. Luego, el sistema crea una nueva instancia usando onCreate(), y esta nueva instancia de Actividad se inicializa con la nueva configuración actualizada. Esto también significa que la interfaz también se recrea con la nueva configuración.
El comportamiento de recreación le ayuda a adaptarse a la nueva configuración al recargar automáticamente la aplicación con recursos alternativos que coincidan con la nueva configuración del dispositivo.

Recrea el ejemplo

Supongamos que hay un TextView que muestra un título estático usando android:text="@string/title" definido en el archivo XML de diseño. Una vez creada la vista, la vista establece el texto exactamente una vez según el idioma actual. Si el idioma cambia, el sistema recrea la actividad. Por lo tanto, la vista también se recrea e inicializa con los valores correctos para el nuevo idioma.
El proceso de recreación también borra cualquier estado que haya mantenido como campos en la Actividad o sus Fragmentos, Vistas u otros objetos contenidos. Esto se debe a que el proceso de recreación de la actividad crea una instancia completamente nueva de la actividad y la interfaz. Además, la antigua Actividad anterior ya no es visible ni válida, por lo que cualquier referencia restante a esa actividad o a los objetos que contiene está desactualizada. Provocan errores, pérdidas de memoria y fallos.

Nota: Recrear una Actividad debido a un cambio de configuración es solo uno de los casos en los que el sistema destruye la Actividad y la recrea más tarde. Consulte Ciclo de vida de la actividad para obtener más detalles.

Cambios de configuración: conceptos clave y mejores prácticas

Cuando se trata de cambios de configuración, es necesario comprender los siguientes conceptos clave:

  • Configuraciones: las configuraciones del dispositivo definen cómo aparece la interfaz de usuario para los usuarios, como el tamaño de visualización de la aplicación, la configuración regional o el tema del sistema.
  • Cambios de configuración: las configuraciones cambian según la interacción del usuario. Por ejemplo, los usuarios pueden cambiar la configuración del dispositivo o cómo interactúan físicamente con el dispositivo. No puede evitar cambios de configuración.
  • Recreación de la actividad: de forma predeterminada, los cambios de configuración hacen que se vuelva a crear la actividad. Este es un mecanismo integrado para reinicializar el estado de la aplicación para nuevas configuraciones.
  • Destrucción de la actividad: la recreación de la actividad hace que el sistema destruya la instancia de actividad anterior y cree una nueva en su lugar. Las instancias antiguas ahora están obsoletas. Cualquier referencia restante a esta instancia provocará pérdidas de memoria, errores o bloqueos.
  • Estado: el estado en la instancia de Actividad anterior no existe en la nueva instancia de Actividad porque son dos instancias de objetos diferentes. Conserve el estado de la aplicación y del usuario como se describe en Guardar el estado de la interfaz de usuario.
  • Deshabilitar: deshabilitar la recreación de actividades para ciertos tipos de cambios de configuración es una optimización potencial. Debe asegurarse de que la aplicación esté actualizada correctamente con la nueva configuración.

Para brindar una buena experiencia de usuario, siga estas prácticas recomendadas:
Prepárese para cambios de configuración frecuentes : no asuma que los cambios de configuración ocurrirán rara vez o nunca, independientemente del nivel de API, el factor de forma o el kit de herramientas de interfaz. Cuando los usuarios realizan cambios en la configuración, esperan que la aplicación se actualice y continúe funcionando normalmente con la nueva configuración.
Preservar estado : no pierda el estado del usuario al recrear la actividad. Conserve el estado como se describe en Cómo guardar el estado de la interfaz de usuario.
Evite deshabilitar las soluciones rápidas : no deshabilite la recreación de actividades, es fácil evitar la pérdida de estado. Deshabilitar la recreación de actividades requiere un compromiso para manejar los cambios y es posible que pierda el estado debido a la recreación de actividades debido a otros cambios de configuración, la finalización del proceso o el cierre de la aplicación. Por lo tanto, no puede desactivar completamente la recreación de actividades. Conserve el estado como se describe en Cómo guardar el estado de la interfaz de usuario.
No eludir los cambios de configuración : no imponga restricciones en la orientación de la pantalla, la relación de aspecto o el cambio de tamaño para eludir los cambios de configuración y la recreación de la actividad. Esto afecta negativamente a los usuarios que quieren utilizar la aplicación como prefieren.

Cambie dinámicamente entre pantallas horizontales y verticales en el código

Para cambiar la orientación de la pantalla en el código, llame principalmente al método setRequestedOrientation (int requestOrientation), que es equivalente a android:screenOrientation configurado en AndroidManifest.xml.

Nota: Después de modificar la orientación de la pantalla mediante setRequestedOrientation, es similar a configurar android: screenOrientation y el efecto es el mismo. Por ejemplo: después de llamar a setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT), no importa cómo se gire la pantalla, la orientación de la pantalla no cambiará. Si desea restaurar para responder a la transformación de las pantallas horizontales y verticales con el dispositivo sensor de orientación física, debe llamar manualmente a un código similar a setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR) para restaurar. (El efecto es similar, pero la orientación se establece dinámicamente a través del resultado del paquete sin código)

Escenario aplicable: si nuestra aplicación está disponible tanto para teléfonos móviles como para tabletas, pero el teléfono móvil solo puede tener una pantalla vertical y no se puede cambiar, y la tableta solo puede tener una pantalla horizontal y no se puede cambiar, luego de distinguir si el dispositivo es un teléfono móvil o tableta, en BaseActivity La orientación de la pantalla se establece a través de setRequestedOrientation en el método onCreate.

Adaptación de pantalla en modo reinicio.

En el modo de reinicio, si agrega diseño-land (carpeta de diseño horizontal) y diseño-port (carpeta de diseño vertical) en el directorio de recursos res, reinicie el modo de actividad para cambiar entre pantallas horizontales y verticales, y el sistema mostrará automáticamente la pantalla correcta. dirección para nosotros diseño UI.

Adaptación de pantalla en modo sin reinicio

Al cambiar entre pantallas horizontales y verticales en el modo Actividad sin reinicio, nuestra Actividad no se destruirá ni reconstruirá, y no se perderán datos. Entonces, si agrega diseño-land y diseño-puerto en el directorio de recursos res de acuerdo con el método anterior, encontrará que no tiene ningún efecto. ¿Qué debe hacer en este momento?

De hecho, también es muy simple: simplemente suelte setContentView nuevamente en onConfigurationChanged.

conexión de referencia

Guarde y restaure el estado de adaptación de la pantalla para el cambio de pantalla horizontal y vertical

Supongo que te gusta

Origin blog.csdn.net/qq_42015021/article/details/132522347
Recomendado
Clasificación