前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

Android:既存アプリにMaterial Components Themeを段階的に適用する

課題

既存アプリでMaterial Components 対応をするため、テーマを適用してみた。

<style name="AppTheme" parent="Theme.MaterialComponents.Light" />
<style name="AppTheme.NoActionBar" parent="Theme.MaterialComponents.Light.NoActionBar" />

すると、ボタンやテキストボックスの色がまとめて違うものになってしまった。 全部を個別に対応するのは大変なので段階的に対応したい。どうすればよいか。

対応

Theme.MaterialComponents を適用した時点で各パーツでは従来の android:textColor などではなく colorOnPrimary などのマテリアルコンポーネント用の色定義が使用されるようになる。これらをすべての部品のStyleに適切に適用していけばよいのだが、既存アプリではそうもいかない。見落としも発生しそうである。そんな場合のためにブリッジテーマというものが用意されている。

<style name="AppTheme" parent="Theme.MaterialComponents.Light.Bridge" />
<style name="AppTheme.NoActionBar" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge" />

ブリッジテーマは、AppCompatテーマを継承しつつ、新しいMaterial Componentsテーマの属性を定義してくれる。ブリッジテーマを使用すれば、アプリに定義済みのスタイルを変更することなく、Material Designコンポーネント、テーマを使い始めることができる。

背景

なんでこれが必要になったかというと、BottomNavigationViewでgetOrCreateBadge関数を使ってバッジを表示しようとしたらTheme.MaterialComponents がアプリに適用されていない場合に例外が発生するようなチェックロジックが仕掛けられていて、マテリアルコンポーネント対応が必須となったから。ボトムナビのバッジのためだけに全体のスタイル定義修正するのは結構大変なので段階的に進めたかったのだ。

参考

material.io