Theme.AppCompat é usado para definir o tema global para todo o aplicativo. ThemeOverlay.AppCompat é usado para substituir (ou "sobrepor") esse tema para visualizações específicas, especialmente a barra de ferramentas.
Vejamos um exemplo de por que isso é necessário.
Temas de aplicativos com uma ActionBar
O ActionBar normalmente é mostrado em um aplicativo. Posso escolher sua cor definindo o colorPrimary
valor. No entanto, alterar o tema altera a cor do texto na ActionBar.
<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>
Como minha cor primária é azul escuro, provavelmente devo usar um dos temas que usa uma cor de texto clara na barra de ação porque o texto em preto é difícil de ler.
Escondendo a ActionBar e usando uma barra de ferramentas
O objetivo de usar Theme.AppCompat em vez de Theme.Material é permitir que versões mais antigas do Android usem nosso tema de design de material. O problema é que as versões mais antigas do Android não suportam o ActionBar. Assim, a documentação recomenda ocultar a ActionBar e adicionar uma barra de ferramentas ao seu layout. Para ocultar a ActionBar, temos que usar um dos NoActionBar
temas. As imagens a seguir mostram a barra de ferramentas com a ActionBar oculta.
Mas e se eu quiser algo como um tema Light com uma DarkActionBar? Já que tenho que usar NoActionBar, isso não é uma opção.
Substituindo o tema do aplicativo
É aqui que entra o ThemeOverlay. Posso especificar o tema Dark ActionBar no layout xml da barra de ferramentas.
<android.support.v7.widget.Toolbar
...
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
Isso finalmente nos permite ter o efeito que desejamos. O tema Dark.ActionBar se sobrepõe ao tema do aplicativo Light para esta ocasião específica.
- Tema do aplicativo:
Theme.AppCompat.Light.NoActionBar
- Tema da barra de ferramentas:
ThemeOverlay.AppCompat.Dark.ActionBar
Se você quiser que o menu pop-up seja leve, você pode adicionar isto:
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
Um estudo mais aprofundado
Aprendi isso por meio de experiências e lendo os artigos a seguir.