1. ホーム
  2. android

[解決済み] Theme.AppCompat と ThemeOverlay.AppCompat はいつ使い分けるのか?

2022-08-16 20:58:40

質問

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 の意図されたユースケースは何なのか気になります。

どのように解決するのですか?

これにつき テーマ vs スタイルのブログ記事 を AppCompat の作成者が書いています。

[ThemeOverlays] は、通常の Theme.Material テーマをオーバーレイする特別なテーマで、関連する属性を上書きして、明暗のいずれかを指定します。

ThemeOverlay + ActionBar

鋭い目をお持ちの方は、ActionBar ThemeOverlayのデリバティブもご覧になったことでしょう。

  • ThemeOverlay.Material.Light.ActionBar
  • ThemeOverlay.Material.Dark.ActionBar
<ブロッククオート

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

現在、これらが親と異なる唯一のことは、親と同様に colorControlNormalandroid:textColorPrimary となり、テキストやアイコンが不透明になります。