Android

Androidのthemeにつけられた命名のメモ

Android Framework、AppCompat、MaterialComponentsには、たくさんのテーマが定義されています。
xml上で指定する際には全てのテーマがサジェストされるため、どれを使えばいいのかわかりづらいですね。

テーマにはいくつかの命名ルールがあり、ざっと知っておくことでどれを使えばよいか判断しやすくなるかもしれないので書き留めておきます。間違っているところがあればご指摘ください:pray:

Base

例) Base.Widget.AppCompat.Light.ActionBar

Baseを取ったkeyのテーマのparentです。values-v17、values-v21といったバージョンごとに指定する属性が変わるので、親となるテーマをBase.~という命名で定義されています。基本的に、アプリを作る時にBase.~のテーマを継承するシーンはないはずです。

Base.がどのような依存関係でバージョン差異を補完しているかは、次の記事のグラフを見るとなんとなくわかると思います。 AndroidのAppCompat Themeの継承関係がよくわからないので図にしてみた

ThemeOverlay

例) ThemeOverlay.AppCompat.ActionBar

アプリケーション全体に指定しているテーマとは別に、ActionBarやダイアログといった各コンポーネントごとに指定する時に使います。例えば、ActionBarのbackgroundやtitleはアプリケーションで定義したテーマとは違うものにしたい場合にactionBarThemeThemeOverlay.AppCompat.ActionBarThemeOverlay.AppCompat.Dark.ActionBarを継承したテーマを指定します。

という話がAppCompatのauthorの1人でもあるChris BanesのTheme vs Styleという記事にも書いてあるのですが、実際にはWidget.AppCompat.ActionBarを継承する時と同じ属性を指定する必要があるので、いまいち使う理由がわかっていません。ThemeOverlay.~のテーマを使う必要がある理由がわかる方がいれば教えてほしいです。

DayNight

例) Theme.AppCompat.DayNight, Theme.AppCompat.DayNight.DialogWhenLarge

values-nightvalues-nonightにそれぞれテーマを用意しておくことで日中・夜間で表示を切り替えたい時に使うテーマです。DayNight対応しないのであれば指定することはないはずです(ダークモード対応とは違います)。

詳しくは、次の記事を参考にしてください。 SupportLibrary rev.23.2 で導入された DayNight テーマを使おう

LightDark

例) Widget.AppCompat.Light.PopupMenu, ThemeOverlay.AppCompat.Dark.ActionBar

Lightは背景が明るいテーマ、Darkは背景が暗いテーマです。
アプリケーションのテーマに指定するのはLightのテーマが多いのではないかと思います。文字色やその他の色はtextColorcolorPrimary属性などで指定しましょう。
ActionBarやToolbar、BottomNavigationViewなどは、アプリケーションで定義したテーマのとは別のテーマを適用したくなることも多いと思います。テーマで設定できる属性は下記にまとまっているので、個別に指定できないか確認しましょう。

Inverse

例) TextAppearance.AppCompat.Widget.ActionMode.Title.Inverse

Inverseなしのテーマと比べてテキストやアイコンの色の明暗が逆になっているテーマです。