課題
既存アプリで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
がアプリに適用されていない場合に例外が発生するようなチェックロジックが仕掛けられていて、マテリアルコンポーネント対応が必須となったから。ボトムナビのバッジのためだけに全体のスタイル定義修正するのは結構大変なので段階的に進めたかったのだ。