Theme.AppCompat se utiliza para establecer el tema global de toda la aplicación. ThemeOverlay.AppCompat se utiliza para anular (o "superponer") ese tema para vistas específicas, especialmente la barra de herramientas.
Veamos un ejemplo de por qué esto es necesario.
Temas de aplicaciones con ActionBar
La ActionBar normalmente se muestra en una aplicación. Puedo elegir su color estableciendo el colorPrimary
valor. Sin embargo, cambiar el tema cambia el color del texto en la barra de acciones.
<style name="AppTheme" parent="Theme.AppCompat">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
Dado que mi color principal es el azul oscuro, probablemente debería usar uno de los temas que usa un color de texto claro en la barra de acción porque el texto negro es difícil de leer.
Ocultar la barra de acciones y usar una barra de herramientas
El objetivo de usar Theme.AppCompat en lugar de Theme.Material es que podamos permitir que las versiones anteriores de Android usen nuestro tema de diseño de materiales. El problema es que las versiones anteriores de Android no son compatibles con ActionBar. Por lo tanto, la documentación recomienda ocultar la barra de acciones y agregar una barra de herramientas a su diseño. Para ocultar la ActionBar tenemos que usar uno de los NoActionBar
temas. Las siguientes imágenes muestran la barra de herramientas con la barra de acciones oculta.
Pero, ¿qué pasa si quiero algo como un tema claro con DarkActionBar? Como tengo que usar NoActionBar, esa no es una opción.
Anulación del tema de la aplicación
Aquí es donde entra ThemeOverlay. Puedo especificar el tema Dark ActionBar en mi diseño xml de la barra de herramientas.
<android.support.v7.widget.Toolbar
...
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
Esto finalmente nos permite tener el efecto que queremos. El tema Dark.ActionBar se superpone al tema de la aplicación Light para esta ocasión en particular.
- Tema de la aplicación:
Theme.AppCompat.Light.NoActionBar
- Tema de la barra de herramientas:
ThemeOverlay.AppCompat.Dark.ActionBar
Si desea que el menú emergente sea ligero, puede agregar esto:
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
Estudio adicional
Aprendí esto a través de la experimentación y leyendo los siguientes artículos.