Android Design Support Library を少しだけ触ってみました

※ 自分のブログ記事の再掲です : http://blog.384ta.com/android-design-support-library

Google I/O 2015 で Android M Preview が発表されると同時に、[Android Design Support Library](http://android-developers.blogspot.jp/2015/05/android-design-support-library.html) (以下 ADSL) が使えるようになりました。

ADSL はこれまで Material Design ガイドラインにありながらも、標準 API や Support Library API では自前で実装するしかなかったパーツをライブラリとして、補完してくれるものです。

- NavigationView
- TextInputLayout
- FloatingActionButton
- CoordinatorLayout / Snackbar

の 4 つを触ってみました。

## ADSL の使い方

build.gradle に

```groovy
dependencies {
  compile 'com.android.support:design:22.2.0'
}
```

を追加して、 Sync します。

## NavigationView

NavigationView は DrawerLayout の中に設置する要素です。これまで RelativeLayout や ListView などを組み立てて作っていたナビゲーションドロワーを 1 つの要素で作ることができるようになりました。

[![drawer.png](https://d23f6h5jpj26xu.cloudfront.net/4kb2xfwnk45w_small.png)](http://img.svbtle.com/4kb2xfwnk45w.png)

```xml
<android.support.design.widget.NavigationView
    android:id="@+id/main_drawer_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:headerLayout="@layout/drawer_header"
    app:menu="@menu/main_drawer"/>
```

app:headerLayout には、ドロワーのヘッダービューに表示したいレイアウトファイルを指定し、app:menu にはドロワー内のメニュー要素のファイルを指定します。例えば @menu/main_drawer であれば、

```xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/drawer_item_1"
            android:checked="true"
            android:icon="@android:drawable/ic_menu_add"
            android:title="@string/hello_world"/>
        <item
            android:id="@+id/drawer_item_2"
            android:icon="@android:drawable/ic_menu_add"
            android:title="@string/hello_world"/>
        <item
            android:id="@+id/drawer_item_3"
            android:icon="@android:drawable/ic_menu_add"
            android:title="@string/hello_world"/>
        <item
            android:id="@+id/drawer_item_4"
            android:icon="@android:drawable/ic_menu_add"
            android:title="@string/hello_world"/>
        <item
            android:id="@+id/drawer_item_5"
            android:icon="@android:drawable/ic_menu_add"
            android:title="@string/hello_world"/>
    </group>
</menu>
```

このように記述します。ドロワー内のメニューを選択したときの処理は、 NavigationView の setNavigationItemSelectedListener に OnNavigationItemSelectedListener のインスタンスを渡して行います。

```java
NavigationView navigationView = (NavigationView) findViewById(R.id.main_drawer_view);
navigationView.setNavigationItemSelectedListener(this);

@Override
public boolean onNavigationItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.drawer_item_1) {
      // do it
    }

    return false;
}
```

## TextInputLayout

TextInputLayout を使うと Floating Labels を簡単に実装できます。 EditText を TextInputLayout で包んであげるだけで OK です。

[![textinputlayout.png](https://d23f6h5jpj26xu.cloudfront.net/ugrfntmz5xicka_small.png)](http://img.svbtle.com/ugrfntmz5xicka.png)

```xml
<android.support.design.widget.TextInputLayout
    android:id="@+id/first_text_input_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">


    <android.support.v7.widget.AppCompatEditText
        android:id="@+id/first_edit_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/hello_world"/>

</android.support.design.widget.TextInputLayout>
```

## FloatingActionButton

FloatingActionButton もとても簡単に使えます。ただし、 Inbox アプリのように子メニューが展開するようなものは作れません。その場合はサードパーティのライブラリに頼るか、自作をするかになりそうです。

[![fab.png](https://d23f6h5jpj26xu.cloudfront.net/755lgm06nrcj8a_small.png)](http://img.svbtle.com/755lgm06nrcj8a.png)

```xml
<android.support.design.widget.FloatingActionButton
    android:id="@+id/first_fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|right"
    android:layout_marginBottom="16dp"
    android:layout_marginRight="16dp"
    android:src="@drawable/ic_star_white_24dp"/>
```

## CoordinatorLayout / Snackbar

Material Design ガイドラインの Snackbars & toasts を見ると、 Snackbar と Floating Action Button を使う場合は、 Floating Action Button を隠してはいけないというものがあります。

> Move your floating action button vertically to accommodate the snackbar height.

ADSL にある CoordinatorLayout を使うと、 Floating Action Button と Snackbar を組み合わせたときに Floating Action Button の位置を自動で調整してくれます。

[![snackbar.png](https://d23f6h5jpj26xu.cloudfront.net/oboehf03b5jvlg_small.png)](http://img.svbtle.com/oboehf03b5jvlg.png)

```xml
<android.support.design.widget.CoordinatorLayout
    android:id="@+id/first_coordinator_layout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Content Layout Area -->

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/first_fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|right"
        android:layout_marginBottom="16dp"
        android:layout_marginRight="16dp"
        android:src="@drawable/ic_star_white_24dp"/>

</android.support.design.widget.CoordinatorLayout>
```

Snackbar を表示するには Toast と同じように表示させることができますが、 ParentView を渡す必要があるので注意が必要です。例えば上の例で Floating Action Button を押して Snackbar を表示させる場合は、

```java
final CoordinatorLayout coordinatorLayout = (CoordinatorLayout) view.findViewById(R.id.first_coordinator_layout);
FloatingActionButton fab = (FloatingActionButton) view.findViewById(R.id.first_fab);
fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Snackbar.make(coordinatorLayout, R.string.hello_world, Snackbar.LENGTH_LONG).show();
    }
});
```

Snackbar.make の第一引数に CoordinatorLayout を渡しています。

## サンプルコード

GitHub に置いておきました。

https://github.com/ryugoo/design-support-library-sample