AppCompatDelegateの話。
Toolbar
は正直ないわーって感じなんですけど、皆様は適合されたんでしょうか。
DroidKaigiなるイベントがあったらしく、Toolbar
が受け入れられるのかディスられるのかが気になっていたのですけど、「BaseActivity
の是非」が一番のトピックだったっぽい?個人的には、Intent
などのAndroidのルールを隠蔽するために、
nextScreen(ActivityFactory.createFromId(GAMEN_ID_HOGE));
みたいなオレオレ画面遷移メソッドを実装しているBaseActivity
は爆破したくなりますが、それ以外で不満を持ったことはない感じです。
さて、AppCompatDelegate
の話です。ActionBarActivity
は死んでAppCompatDelegate
の時代が来ました。それをざっくり説明すると以下の通りです。
今までのサポートライブラリ
Fragment
やActionBar
の概念が導入されたのはAndroid3.0。このうちFragment
はAPIレベル4まで、ActionBar
はAPIレベル7までバックポートされています。
Fragment
のバックポートの責務はFragmentActivity
に、ActionBar
のバックポートの責務はActionBarActivity
にあったため、上のような継承構造となっていました。
どう変わったか
AppComatDelegate
にActionBar
のバックポートや、マテリアルデザインのための諸々の責務を全て委譲するように変わりました。
実際のところ、少し前からActionBarActivityDelegate
という名前で、ほぼ現在と近い実装になっていました。22.1というマイナーアップデートでお披露目となっているのもそのためだと思っています。
AppCompatActivity
は単なるガワです。継承しなくても互換性のあるアプリを作ることができます。
これまでの継承構造では、PreferencesActivity
が死にクラスになっていたとしばしば批判されていました。AppCompatPreferenceActivity
というサンプルを見るのが分かりやすいのですが、この変更によって、どのような継承構造のActivityであっても、AppComatDelegate
に処理を委譲することで互換性を維持できるのです!!
というのは嘘です。
確かに公式ブログにも、
However, this wasn’t just a rename. In fact, the internal logic of AppCompat is now available via AppCompatDelegate - a class you can include in any Activity, hook up the appropriate lifecycle methods, and get the same consistent theming, color tinting, and more without requiring you to use AppCompatActivity (although that remains the easiest way to get started).
私訳:しかしながら、この変更は単なる改名ではありません。AppCompatの内部ロジックは全てAppCompatDelegateにより今すぐ利用可能です。このクラスはAppCompatActivityを必要とせず、あらゆるActivityに取り込むことができ、ライフサイクルメソッドと適切に連携することで、一貫性のあるテーマ、色の変異(color tinting)などを実現できます。(それを開始する最も簡単な方法として、AppCompatActivityも残されています)
というようなことが書いてあります。
しかし、AppCompatActivity
がFragmentActivity
を継承していることを忘れないで下さい。
FragmentActivity
が扱っているのはv4のFragment
(偽)です。普通のActivity
が扱うFragment
(真) とは別物です。
AppComatDelegate
が解決する問題はマテリアルデザインとActionBar
(と便宜的に呼ばれ続けているToolbar
)の領域だけなのです。そのため、独自のActivity
に組み込んでもいいケースは、Fragment
を使う機会が全くないか、もしくはandroid.support.v4.app.Fragment
とandroid.app.Fragment
が混在しても支障がない場合に限られるということです。同様のことはLoader
にも言えます。
AppCompatActivity
は必ず継承した方が無難だと思います。
また、AppCompatDelegate
が扱うToolbar
はv7のToolbar
(偽)であり、普通のActivity
が扱うToolbar
(真)とは別物なのも微妙なトラップなのでご注意下さい。