web-dev-qa-db-ja.com

Theme.AppCompatとThemeOverlay.AppCompatをいつ使用する必要がありますか?

次の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

たとえば、なぜThemeOverlay.AppCompat.lightとTheme.AppCompat.Lightを使用するのでしょうか? ThemeOverlayに定義されている属性ははるかに少ないことがわかります。ThemeOverlayの使用例が何であるか興味があります。

102

このあたり テーマとスタイルのブログ投稿 AppCompatの作成者:

[ThemeOverlays]は、通常のTheme.Materialテーマにオーバーレイする特別なテーマであり、関連する属性を上書きして明るい/暗いにする。

ThemeOverlay + ActionBar

あなたの鋭い目は、ActionBar ThemeOverlay派生物も見たことでしょう:

  • ThemeOverlay.Material.Light.ActionBar
  • ThemeOverlay.Material.Dark.ActionBar

これらは、新しいactionBarTheme属性を介してアクションバーで使用するか、ツールバーで直接設定する必要があります。

現在これらが親と異なるのは、colorControlNormalAndroid:textColorPrimaryに変更し、テキストとアイコンを不透明にすることだけです。

66
ianhanniballake

Theme.AppCompatは、アプリ全体のグローバルテーマを設定するために使用されます。 ThemeOverlay.AppCompatは、特定のビュー、特にツールバーのテーマをオーバーライド(または「オーバーレイ」)するために使用されます。

これが必要な理由の例を見てみましょう。

ActionBarを使用したアプリのテーマ

通常、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>

enter image description here

私の原色は濃い青なので、黒のテキストは読みにくいため、アクションバーで明るいテキストの色を使用するテーマのいずれかを使用する必要があります。

ActionBarを非表示にしてツールバーを使用する

Theme.MaterialではなくTheme.AppCompatを使用することの全体的な目的は、Androidの古いバージョンがマテリアルデザインテーマを使用できるようにすることです。問題は、Androidの古いバージョンがActionBarをサポートしていないことです。したがって、 documentation では、ActionBarを非表示にし、レイアウトにツールバーを追加することをお勧めします。 ActionBarを非表示にするには、NoActionBarテーマのいずれかを使用する必要があります。次の画像は、アクションバーが非表示のツールバーを示しています。

enter image description here

しかし、DarkActionBarを備えたLightテーマのようなものが必要な場合はどうでしょうか。 NoActionBarを使用する必要があるため、これはオプションではありません。

アプリテーマのオーバーライド

ThemeOverlayの出番です。ツールバーのxmlレイアウトでDark ActionBarテーマを指定できます。

<Android.support.v7.widget.Toolbar
    ...
    Android:background="?attr/colorPrimary"
    Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />

これにより、最終的に希望する効果が得られます。 Dark.ActionBarテーマoverlaysこの特定の機会のLightアプリテーマ。

enter image description here

  • アプリのテーマ:Theme.AppCompat.Light.NoActionBar
  • ツールバーテーマ:ThemeOverlay.AppCompat.Dark.ActionBar

ポップアップメニューを明るくしたい場合は、これを追加できます。

app:popupTheme="@style/ThemeOverlay.AppCompat.Light"

さらなる研究

これは、実験を通じて、また次の記事を読むことで学びました。

136
Suragch