Java
Android
XML
MaterialDesign

Holo テーマのアプリを Material テーマのアプリにするまで

More than 3 years have passed since last update.

3.x 以前を綺麗に忘れ去って、4.x 以降に対応するアプリを作っている場合、support.v7.appcompat の存在を気にかけないでも普通に ActionBar が使えるので、かなり楽ができるのですが、ここへ来てマテリアルデザインが登場し、それ用に support.v7.appcompat もアップデートされ、マテリアルデザインに対応するには support.v7.appcompat の使用が必須要件になったので、そのあたりの備忘録として書き残しておきます。

テーマを、Theme.AppCompat のものにする

Lollipop だけマテリアルデザインで古いやつは Holo でいいんじゃね?という道を選択するならば、もはやここに書いてあることはほぼすべてやらなくても良いことになります(ただし、ActionBarDrawerToggle だけは、v4 版と v7 版を、Lollipop 以前と以後で使い分ける処理を各必要がある)。

テーマを変える話は、Gingerbread までの頃から IceCreamSandwich 以降へ対応するため、android.support.v7.appcompat ライブラリが登場した時にしたことと同じですね。懐かしいですね。

すべての Activity の親を android.support.v7.app.ActionBarActivity にする

うっかり FragmentActivity のままにしても動かないことはないですが、ActionBar が無かったことになったりします。すべて ActionBarActivity にしましょう。

そうすると、PreferencesActivity が困ったことになります。未だに公式の support library に入ってこないため使えません。有志で PreferenceFragment をバックポートしている人がいるので、それを代わりに使用し、PreferencesActivity は ActionBarActivity として Fragment で Preferences を管理する方法があります。

https://github.com/kolavar/android-support-v4-preferencefragment

v4 なんて知らねーぜ!な場合は普通に PreferenceFragment を使えば良いと思います。

もちろん、いままで Activity#getActionBar() していたものはすべて ActionBarActivity#getSupportActionBar() にする必要があります。でないとクラッシュします。

MenuItem の showAsAction のネームスペースを変える

標準のネームスペースが使えて欲しいですが、使えないのでカスタムアトリビュートのものにします。

ActionBarDrawerToggle を android.support.v7.app のものに変える

ネームスペースを v4 から v7 に変えます。また、コンストラクタが変わっていて、drawer 用に三本線のハンバーガーアイコンのリソースを指定しなくてもよくなったので、これを消します。

ちなみに、最新の v4 では TargetSDK を 21 にして、Lollipop 上で動かすと、三本線のハンバーガーアイコンはアニメーションしないようになっています。
さらに、v7 のものを使用しながら Kitkat 以前で Holo テーマを使うようにしていると、ハンバーガーアイコンだけがマテリアルデザインのものになり、アニメーションもマテリアルデザイン化されます。完全に余談ですし多分誰もやらないと思いますが…

結論

はじめから v7 の appcompat を使えば話は早かった