[この記事は デベロッパー アドボケート、Ian Lake による Android Developers Blog の記事 Android Support Library 23.2" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]

Android Support Library についてまず知っていただきたいことは、それが単一のライブラリではなくライブラリの集合体であることです。それぞれが後方互換性や追加の機能を提供しています。バージョン 23.2 では既存の多くのライブラリに新機能が追加され、またいくつかの新しいサポート ライブラリも追加されました。


ベクター ドローアブルとアニメーション付きベクター ドローアブルのサポート

ベクター ドローアブルを使用すると、複数の PNG 画像のアセットを XML で定義された 1 つのベクター グラフィックに置き換えることができます。これまでは Lollipop 以降のデバイスでしか使用できませんでしたが、新しい 2 つのサポート ライブラリ support-vector-drawableanimated-vector-drawable により、VectorDrawableAnimatedVectorDrawable の両方が使用できるようになりました。

Android Studio 1.4 ではビルドの時点で PNG を生成することで、ベクター型ドローアブルを限定的にサポートしていました。サポート ライブラリを活用して容量を節約するには、この機能を無効化する必要があります。そのためには、build.gradle ファイルに vectorDrawables.useSupportLibrary = true を追加します。

 // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }  

この新しい属性は、Gradle プラグインのバージョン 2.0 にのみ存在します。Gradle 1.5 を使用している場合は、代わりに以下を使用してください。

 // Gradle Plugin 1.5  
 android {  
   defaultConfig {  
     generatedDensities = []  
  }  

  // This is handled for you by the 2.0+ Gradle Plugin  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
 }  

VectorDrawableCompat は API 7 以降、AnimatedVectorDrawableCompat は API 11 以降のすべてのデバイスで使用できます。Android のドローアブルのロード方法が原因で、ドローアブル ID を読み込む場所(XML ファイルなど)によっては、ベクター型ドローアブルをロードできない場合があります。しかし、AppCompat で新しいベクター型ドローアブルを使いやすくする多くの機能が追加されています。

まず、ImageView(または ImageButtonFloatingActionButton などのサブクラス)と AppCompat を使用すると、新しい app:srcCompat 属性を使用してベクター型ドローアブル(や android:src で使用できる他のドローアブル)を参照できます。

 <ImageView  
  android:layout_width="wrap_content"  
  android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add" />  

また、実行時にドローアブルを変更している場合は、以前と同じ setImageResource() メソッドを使用できます。この点に変更はありません。ベクター型ドローアブルをアプリに統合するには、AppCompat と app:srcCompat を使用するのがもっとも確実です。

Lollipop 以前では、app:srcCompat の外側にあるベクター型ドローアブルは直接参照できませんでした。しかし、AppCompat では、StateListDrawableInsetDrawableLayerDrawableLevelListDrawableRotateDrawable のような別のドローアブル コンテナから参照されているベクター型ドローアブルをロードできます。この迂回方法により、通常はベクター型ドローアブルに対応していない TextViewandroid:drawableLeft 属性などにベクター型ドローアブルを使用できます。

AppCompat の DayNight テーマ

アプリ全体にベクター グラフィックを使用できるようになった点は AppCompat の大幅な変更点ではありますが、さらに本リリースでは、新しいテーマ Theme.AppCompat.DayNight も追加されました。


API 14 以前で DayNight テーマやその派生テーマ DayNight.NoActionBarDayNight.DarkActionBar、DayNight.Dialog などを使用すると、Light に相当するテーマのみが使用されます。API 14 以降のデバイスでは、アプリでこのテーマを使用すると、Light テーマと Dark テーマの両方を簡単にサポートできるようになり、「夜間」には Light テーマから Dark テーマに効率よく切り替わります。

デフォルトでは、「夜間」かどうかはシステム値(UiModeManager.getNightMode() から取得)と一致するかどうかで判断していますが、AppCompatDelegate のメソッドを使用すると、この値を上書きできます。静的メソッド AppCompatDelegate.setDefaultNightMode() を使用して(プロセスが再起動されるまで)アプリ全体にデフォルトを設定するか、getDelegate() から AppCompatDelegate を取得し、setLocalNightMode() を使用して現在のアクティビティまたはダイアログのみを変更することができます。

AppCompatDelegate.MODE_NIGHT_AUTO を使用すると、時刻や(アプリに位置パーミッションがある場合は)最後に取得した場所を使用して、自動的に昼と夜のモードを切り替えます。MODE_NIGHT_NO は Dark テーマを強制的に使用しないように設定し、MODE_NIGHT_YES は常に使用するように設定します。

色をハードコードすると、テキストやアイコンが見にくくなる場合も多いので、DayNight テーマを使用する際は、アプリを十分にテストする必要があります。標準の TextAppearance.AppCompat スタイルを使用してテキストや色をテーマから取得している場合(android:textColorPrimary など)は、使用しているテキストや色は自動的にアップデートされます。

ただし、夜間モード用に特別にリソースをカスタマイズしたい場合は、AppCompat は night 修飾子が付いたリソース フォルダーを使い回すようになっているため、必要なすべてのリソースをカスタマイズできます。標準色を使用するか、AppCompat の着色機能を活用すれば、このモードをもっと簡単に適用できるようになります。

Design サポート ライブラリ: Bottom Sheet

Design サポート ライブラリでは、さまざまなマテリアル デザインのパターンの実装を提供しています。本リリースでは、アプリに Bottom Sheet を簡単に追加できるようになりました。

BottomSheetBehaviorCoordinatorLayout の子 View に適用する(app:layout_behavior="android.support.design.widget.BottomSheetBehavior" を追加する)と、タップを検出して自動的に 5 つの状態間を遷移させることができます。
  • STATE_COLLAPSED: この折り畳まれた状態がデフォルトで、画面の最下部にレイアウトの一部のみを表示します。高さは app:behavior_peekHeight 属性(デフォルト値は 0)で制御できます。
  • STATE_DRAGGING: ユーザーが Bottom Sheet を上下に直接ドラッグしているときの中間的な状態です。
  • STATE_SETTLING: View のドラッグが終わってから最終的な位置が確定するまでの短い時間です。
  • STATE_EXPANDED: Bottom Sheet が完全に展開された状態で、Bottom Sheet 全体が表示されている(高さが CoordinatorLayout に含まれる高さ未満の場合)、または CoordinatorLayout が完全に Bottom Sheet で覆われているかのいずれかです。
  • STATE_HIDDEN: デフォルトでは無効化されており(app:behavior_hideable 属性で有効化できます)、有効化すると Bottom Sheet を下にスワイプして、完全に非表示にできます。

Bottom Sheet 内にスクロール可能なコンテナを配置する場合、ネストされたスクロールをサポートしているもの(NestedScrollView または RecyclerView など)である必要があります。

状態変化についてのコールバックは BottomSheetCallback を利用できます。

 // The View with the BottomSheetBehavior  
 View bottomSheet = coordinatorLayout.findViewById(R.id.bottom_sheet);  
 BottomSheetBehavior behavior = BottomSheetBehavior.from(bottomSheet);  
 behavior.setBottomSheetCallback(new BottomSheetCallback() {  
    @Override  
    public void onStateChanged(@NonNull View bottomSheet, int newState) {  
      // React to state change  
    }  
      @Override  
      public void onSlide(@NonNull View bottomSheet, float slideOffset) {  
       // React to dragging events  
   }  
 });  

BottomSheetBehavior を使えば常に表示される Bottom Sheet を作ることができます。本リリースには BottomSheetDialogBottomSheetDialogFragment も含まれており、モーダルな Bottom Sheet のユースケースに対応できます。AppCompatDialogAppCompatDialogFragment を該当する Bottom Sheet 版に置き換えるだけで、ダイアログを Bottom Sheet スタイルに変更できます。

Support v4: MediaBrowserServiceCompat

Support v4 ライブラリは、サポート ライブラリの大部分の基盤として機能します。このライブラリには(多くの独自機能とともに)新バージョンのプラットフォームで導入された多くのフレームワーク機能の下位実装も含まれます。

本リリースでは、以前リリースされた MediaSessionCompat クラスに MediaBrowserServiceCompatMediaBrowserCompat を追加しており、さらに堅牢なメディア再生が可能です。これによって、最新 API(Marshmallow に追加されたものも含みます) の機能を提供する互換ソリューションが API 4 以降のデバイスすべてで使えるようになり、Android Auto での音声再生、Android Wear のメディアからの参照、メディア再生サービスと UI を結びつける標準インターフェースを簡単に提供できるようになりました。

RecyclerView

RecyclerView ウィジェットは、リストやグリッドの作成に役立つ高度で柔軟性の高い基本機能で、アニメーションもサポートしています。本リリースでは、LayoutManager API に面白い新機能が追加されました。それが、自動サイズ調整機能です。これによって、RecyclerView をコンテンツのサイズに応じてサイズ変更できるようになります。つまり、以前はできなかった RecyclerView の寸法値に WRAP_CONTENT を使用することができるようになっています。すべてのビルトイン LayoutManager が自動サイズ調整機能に対応しています。

この変更により、ご使用のビュー項目のレイアウト パラメータの再確認が必要となります。(スクロール方向の MATCH_PARENT など)以前は無視されていたレイアウト パラメータが反映されるようになっています。

ビルトインの LayoutManager を継承せず、カスタムの LayoutManager を使用している場合、これはオプトイン API になります。setAutoMeasureEnabled(true) を呼び出し、メソッドの Javadoc に詳しく記載されているとおり、細かな変更を加える必要があります。

RecyclerView は子要素をアニメーションさせますが、自分の境界の変更はアニメーションしませんRecyclerView の境界を変更した時にアニメーションさせたい場合は、Transition API を使用します。

カスタム タブ

カスタム タブを使用すると、アプリのルックアンドフィールを保ったまま、シームレスにウェブ コンテンツに遷移できます。本リリースでは、ボトムバーにアクションを追加して、ウェブ コンテンツとともに表示できるようになりました。

新しい addToolbarItem() メソッドを使用して、アクションをボトムバーに追加できます。追加できるアクションは、現在のところ、最大で 5 つ(MAX_TOOLBAR_ITEMS)までです。セッションの開始後には、setToolbarItem() でアクションをアップデートすることができます。以前の setToolbarColor() メソッドと同様に、setSecondaryToolbarColor() メソッドでボトムバーの背景色をカスタマイズできます。

Android TV の Leanback

Leanback ライブラリには、TV 向けに最適化された多くの標準コンポーネントが含まれており、簡単に Android TV 対応のアプリを作成することができます。GuidedStepFragment は本リリースで大幅に改善されました。

一番わかりやすい変更点は、アクション ボタンに 2 列目が実装されたことでしょう(この列には、onCreateButtonActions() をオーバーライド、または setButtonActions() を呼び出してボタンを追加できます)。使用できる GuidedActions の一覧をスクロールしなくてもアクションを完了できるようになり、操作が簡単になりました。

GuidedActions については、多くの新機能が実装されています。たとえば、記述を編集できるようになり(descriptionEditable() を使用)、ドロップダウン形式でサブアクションを実行できるようになり(subActions() の使用)、GuidedDatePickerAction が導入されるなど、入力操作がかなり改善されました。


これらのコンポーネントを使えば、本当に必要なときにユーザーから情報を取得しやすくなります。

今すぐ入手

Android Support Library バージョン 23.2 は、SDK Manager および Android Studio から入手できます。すべての新機能と今後提供されるバグの追加修正をご活用ください。いつもどおり、バグ レポートは b.android.com から送信してください。Android Development Google+ community に参加して、他のデベロッパーと交流してください。

Posted by Yuichi Araki - Developer Relations Team