¿Cómo usar el tema predeterminado del dispositivo para la aplicación?

Tengo una aplicación que quiero desarrollar para Android 2.1, 2.2, 2.3.3, 3.0 / 3.1 y 4.0.x. Entre esos niveles de API, hay alrededor de 3 tipos diferentes de Temas. El último tema de 4.0.x es Holo.

De todas formas, quiero que mi aplicación utilice el tema predeterminado de Android para cualquier dispositivo en el que se encuentre. Si está en un dispositivo 4.0.x, quiero que utilice Holo. Si está en 2.3.3 quiero que use el tema de esa versión de Android. Etc …

¿Hay una manera simple de abordar esto? Me di cuenta de que con 4.0, se agregó un tema Theme.DeviceDefault que puede utilizar, pero esto no me ayuda para los niveles de API más antiguos. ¿Cuál es el mejor enfoque para esto?

Hay actualmente hasta 3, a veces 4 Temas disponibles para dispositivos Android (variaciones de .Light y similares no incluidas)

Theme

Tema

El valor predeterminado para las versiones más antiguas de Android hasta 2,3 Gingerbread (10), incluyendo algunos cambios de estilo menores en esas versiones


Theme.Holo

Tema.Holo

Introducido con Android 3.0 Honeycomb (11)


Theme.Material

Tema.Material

Nuevo en Android 5.0 Lollipop (21)


Theme.DeviceDefault

(Podría ser cualquier cosa)

Introducido con 4,0 Ice Cream Sandwich (14), un tema que puede ser personalizado por el fabricante del dispositivo. Representa el aspecto nativo del dispositivo, es decir, Holo o Material en dispositivos Nexus (y en el editor de diseño de Android Studio), tal vez algo personalizado en otros dispositivos. En caso de "algo personalizado" no es una opción, los dispositivos deben venir con los temas de stock. Las aplicaciones que quieren que el tema de acciones tienen que especificarlo sin embargo.


¿Cuál es el mejor enfoque para esto?

No hay tema + targetSdkVersion> = 14

La más simple, pero no necesariamente la mejor opción es definir ningún tema en absoluto. Android seleccionará el valor predeterminado para usted. Pero Android no quiere sorprender a tu aplicación con temas que no esperes, por lo que recae en el tema para el que probablemente diseñaste tu aplicación. Lo hace mirando el android:targetSdkVersion dentro de AndroidManifest.xml (que puede ser fijado hoy en día vía gradle).

  • Las aplicaciones que apuntan a plataformas viejas, que sólo tenían Theme (es decir, niveles API 3-10), obtendrán sólo el Theme .
  • Aplicaciones orientadas 11-13 obtener Theme.Holo .
  • 14 o superior obtendrá Theme.DeviceDefault .

Dado que esto es sólo para compatibilidad hacia atrás, no obtendrá Theme.Material en su viejo teléfono Gingerbread. Por lo tanto, ningún tema + objetivo 14+ = dispositivo predeterminado.

Especificación de diferentes temas

El sistema de superposición de recursos de Android permite especificar estilos basados ​​en el nivel de API del dispositivo. Por ejemplo, diferentes versiones de un estilo en res/values-v11 y res/values-v21 . Esto también es lo que cualquier aplicación recién creada a través de Android Studio configurará para usted.

Como ejemplo, la configuración más básica de una aplicación de .Light tiene el siguiente aspecto:

/res/values/styles.xml se aplica a cada dispositivo y sirve como base

 <resources> <style name="AppTheme" parent="android:Theme.Light"/> </resources> 

/res/values-v11/styles.xml se carga en todos los dispositivos que tienen API de nivel 11 y superiores (incluidos los que tienen 21 años o más). Pero sólo la versión más reciente de "AppTheme" es realmente utilizado.

 <resources> <style name="AppTheme" parent="android:Theme.Holo.Light"/> </resources> 

/res/values-v21/styles.xml

 <resources> <style name="AppTheme" parent="android:Theme.Material.Light"/> </resources> 

Nota: alternativamente especificando Theme.DeviceDefault en /res/values-v14/styles.xml debería ser suficiente para tener un aspecto predeterminado pero que no permite afinar el diseño. No hace daño para agregar la anulación v14. DeviceDefault y Holo podrían ser diferentes después de todo.


AndroidManifest.xml es el lugar donde se utiliza el tema personalizado. Por ejemplo, como predeterminado de aplicación general:

 ... <application android:theme="@style/AppTheme" ... 

Enlaces a la documentación oficial

Seleccione un tema basado en la versión de plataforma – Documento oficial para definir estilos diferentes a través de configuraciones de recursos

Holo Everywhere – post de blog que explica el mecanismo por defecto y el tema de DeviceDefault / Holo

Uso del tema material – documentación de materiales

Puedes declarar un tema en tus valores / styles.xml y luego en tus valores-v11 / styles.xml anularlo con la versión Holo:

Values ​​/ styles.xml:

  <style name="DialogTheme" parent="@android:style/Theme.Dialog"></style> 

Values-v11 / styles.xml:

  <style name="DialogTheme" parent="@android:style/Theme.Holo.Light.Dialog.NoActionBar"></style> 

Hazlo de esa manera, y tendrás temas de Holo en dispositivos API 11+ y temas regulares en los demás.

Recuerdos Steffen Vangsgaard

  • Crear tema personalizado descargable y aplicarlo durante el tiempo de ejecución
  • Temas de Android - definición de colores en temas personalizados
  • Tema predeterminado de Android
  • ¿Qué significa el valor Integer en android: theme?
  • ¿Qué atributos de tema necesito anular para cambiar el color de resaltado azul de mis cuadros de diálogo?
  • Personalizar temas que no funcionan
  • Obtener atributos temáticos mediante programación
  • Cómo a los botones del cuadro de diálogo de estilo de Android Holo tema
  • Aplicación del tema AppCompat a las preferencias individuales en un archivo PreferenceFragment
  • Cambiar el color de resaltado y título de los fragmentos en PreferenceActivity
  • Cómo: Definir elemento de tema (estilo) para el widget personalizado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.