次の Theme.AppCompat クラスがあります。
Theme.AppCompat
Theme.AppCompat.Light
Theme.AppCompat.Light.DarkActionBar
Theme.AppCompat.NoActionBar
Theme.AppCompat.Light.NoActionBar
Theme.AppCompat.DialogWhenLarge
Theme.AppCompat.Light.DialogWhenLarge
Theme.AppCompat.Dialog
Theme.AppCompat.Light.Dialog
Theme.AppCompat.CompactMenu
および次の ThemeOverlay.AppCompat クラス:
ThemeOverlay.AppCompat
ThemeOverlay.AppCompat.Light
ThemeOverlay.AppCompat.Dark
ThemeOverlay.AppCompat.ActionBar
ThemeOverlay.AppCompat.Dark.ActionBar
たとえば、Theme.AppCompat.Light ではなく ThemeOverlay.AppCompat.light を使用するのはなぜでしょうか? ThemeOverlay に定義されている属性がはるかに少ないことがわかります。ThemeOverlay の想定される使用例が何なのか興味があります。
ベストアンサー1
Theme.AppCompat は、アプリ全体のグローバル テーマを設定するために使用されます。ThemeOverlay.AppCompat は、特定のビュー、特にツールバーのテーマをオーバーライド (または「オーバーレイ」) するために使用されます。
なぜこれが必要なのか、例を挙げて見てみましょう。
アクションバー付きのアプリテーマ
ActionBar は通常、アプリ内に表示されます。colorPrimary
値を設定することで色を選択できます。ただし、テーマを変更すると、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>
私のメインカラーは濃い青なので、黒いテキストは読みにくいので、アクションバーで明るいテキスト色を使用するテーマの 1 つを使用する必要があるでしょう。
アクションバーを非表示にしてツールバーを使用する
Theme.MaterialではなくTheme.AppCompatを使用する主な目的は、Androidの古いバージョンでマテリアルデザインのテーマを使用できるようにすることです。問題は、Androidの古いバージョンがActionBarをサポートしていないことです。したがって、ドキュメンテーションActionBar を非表示にして、レイアウトに Toolbar を追加することをお勧めします。ActionBar を非表示にするには、NoActionBar
テーマの 1 つを使用する必要があります。次の画像は、ActionBar が非表示になっている Toolbar を示しています。
しかし、DarkActionBar を備えた Light テーマのようなものが必要な場合はどうすればよいでしょうか? NoActionBar を使用する必要があるため、これは選択肢ではありません。
アプリのテーマを上書きする
ここで ThemeOverlay が登場します。Toolbar xml レイアウトで Dark ActionBar テーマを指定できます。
<android.support.v7.widget.Toolbar
...
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
これでようやく望み通りの効果が得られます。Dark.ActionBarテーマオーバーレイこの特別な機会のためのライト アプリ テーマ。
- アプリテーマ:
Theme.AppCompat.Light.NoActionBar
- ツールバーのテーマ:
ThemeOverlay.AppCompat.Dark.ActionBar
ポップアップ メニューを明るくしたい場合は、以下を追加します。
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
さらなる研究
私は実験と以下の記事を読むことでこれを学びました。