xmlns:toolsでAndroid Studioのレイアウトエディタを活用する

## xmlns:tools?
Androidのレイアウトファイルに以下のような記述が含まれていることがあります。

```xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MyActivity"
```
この`xmlns:tools`や`tools:context`とはなんでしょうか。

答えは、Android Tools Projectに書いてありました。
http://tools.android.com/tech-docs/tools-attributes


## 英語よくわからん
という僕自身のために、内容を簡単にまとめました。

## tools:ignore
lint用
`tools:ignore`はリソースのすべてのxml要素に定義できる。
これを定義したxml要素とその子孫要素は、lintによるチェックで指定したissueが無視されるようになる。
複数のissueを無視したい場合、カンマ区切りで指定する。

```xml
<string name="show_all_apps" tools:ignore="MissingTranslation">All</string>
```

## tools:targetApi
lint用
javaの@TargetApiと同じようなものでlintによるチェック時に適用される。
ApiLevelの指定はコードネームと整数両方いけるらしい。

```xml
<GridLayout tools:targetApi="ICE_CREAM_SANDWICH" >
```

## tools:locale
lint/AndroidStudio用
values系リソースファイルのルート要素に定義できる。
これを指定したリソースの文字列は指定ロケール扱いになるらしい。
…デフォルトvaluesの文字列リソースが英語じゃない場合に使うと思うのだけど正直わからん。
結局日本語アプリではどうするべきなの？

```xml
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="es">
```

## tools:context
lint/AndroidStudio/Eclipse用
レイアウトxmlのルート要素で定義する。
レイアウトエディタでの表示に指定`Activity`のテーマが適用されるようになる。
`Activity`の指定は`AndroidManifest`同様`package`からの相対パスで指定できるらしい。

```xml
<android.support.v7.widget.GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity"
```

## tools:layout
AndroidStudio/Eclipse用
レイアウトxmlのfragment要素で定義する。
レイアウトエディタでのfragment要素の表示に指定したレイアウトが適用されるようになる。

```xml
<fragment android:name="com.example.master.ItemListFragment" tools:layout="@android:layout/list_content" />
```

## tools:listitem / listheader / listfooter
AdapterView の子要素(ListViewなど)に定義できる。
それぞれ子要素のレイアウト、ヘッダのレイアウト、フッタのレイアウトを指定する。
レイアウトエディタでのAdapterViewの表示時に指定したレイアウトが適用されるようになる。

```xml
 <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:listitem="@android:layout/simple_list_item_2" />
```

## tools:showIn
AndroidStudio(0.5.8以降)用。
他のレイアウトから`<include>`されるレイアウトのルート要素に定義できる。
AndroidStudioでレイアウトエディタ表示時に親レイアウトに埋め込まれた状態で表示されるらしい。
http://tools.android.com/recent/androidstudio058released

```xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:text="@string/hello_world"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:showIn="@layout/activity_main" />
```

## tools:menu
AndroidStudio(0.8.0以降)用。
レイアウトのルート要素に定義できる。
AndroidStudioのレイアウトエディタでは`tools:context`で`Activity`が指定されている場合、
`Activity#onCreateOptionsMenu`までみてメニューアイテムを表示するらしい。
この要素が定義されているとそれを無視して指定したメニューアイテムを描画するようだ。

```xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:menu="menu1,menu2" />
```

## tools:actionBarNavMode
AndroidStudio(0.8.0以降)用。
レイアウトのルート要素に定義できる。
この要素が定義されている場合、レイアウトエディタにおいてActionBarを指定したモードで描画することができる。
"standard", "list", "tabs"のいずれかを指定する。

```xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:actionBarNavMode="tabs" />
```

## まとめ
toolsについて調べていたつもりがAndroidStudioのレイアウトエディタの進化に驚かされました。
レイアウトエディタからキャプチャも作れるので、tools属性を駆使すれば実機で確認ステップを少し減らせそうですね。
ぜひ活用していきたいです。