読者です 読者をやめる 読者になる 読者になる

ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

Android アプリ開発で使える XML の Tools 属性

Android アプリ

Android アプリのための XML ファイルには、開発時にのみ使用される追加的な情報を書くために使用される名前空間が用意されています。

http://schemas.android.com/tools というのがその名前空間で、普通は名前空間接頭辞 (プレフィクス) tools: に結び付けられます。

上のページを見ながら、どういったことができるのかを紹介します。 『This document records our current uses of tools attributes. (NOTE: These may change over time.)』 と書かれているので、最新の情報は上のページを見て確認してください。

Tools 属性を使ってできること

tools:ignore

どの XML 要素にも付けることができる。 値はカンマで区切られた lint の issue ID のリスト。 Lint による検査時、指定された要素とその子孫要素について、指定された lint の issue が無視されるようになる。

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

Java における @TargetApi アノテーションと似たもの。 指定の要素がどの API level 以上で解釈可能なものなのかを、API level のコードネームか整数で指定することができる。

<GridLayout tools:targetApi="ICE_CREAM_SANDWICH" >

これも lint による検査時に使用される。

例えば android:actionBarStyleAPI Level 11 より古い Android も対象にしているアプリで使うと 『android:actionBarStyle requires API Level 11 (current min is 7)』 ってエラーが lint で出されるけど、そういう場合にこの属性を使えば良い。

<!-- android:actionBarStyle は API Level 11 以降でしか使えない -->
<item name="android:actionBarStyle" tools:targetApi="11">@style/MyActionBar</item>
<!-- API Level 11 より古いものに対しては次のように記述することで対応できる (サポートライブラリの機能) -->
<item name="actionBarStyle">@style/MyActionBar</item>
tools:locale

リソースファイルのルート要素にセットすることができるもので、その値は言語と地域 (オプション) を指定するものである。 この値を指定することで、ファイル中の文字列の言語 (ロケール) が何であるかをツールに知らせることができる。 例えば、values/strings.xml のルート要素を次のように指定すると、文字列の言語が英語ではなくスペイン語であると指定したことになる。

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

これらは lint で使われるのと、Android Studio でも使われる模様。 (英語でないリソースについてはスペル検査が無効になるっぽい。)

tools:context

この属性は、典型的にはレイアウト XML ファイルのルート要素に付けられるもので、そのレイアウトがどのアクティビティで使われるものかを指定する (この値は単にデザイン時に使われるもの; 実際にはそのレイアウトをどのアクティビティと一緒に使っても問題ない)。 この値を指定しておくことで、例えばレイアウトエディタがデフォルトテーマを決めたりできるようになる。 Manifest ファイル中でのドットでのデフォルトパッケージ名の省略と同じことがこの属性の値でも可能。

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

この属性は Android StudioEclipse のレイアウトエディタや、lint で使用される。

tools:layout

典型的には fragment 要素に付けられるもので、デザイン時にどのレイアウトを使用してほしいかを指定するものである。

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

Android StudioEclipse のレイアウトエディタで使用される。

tools:listitem / listheader / listfooter

これらの属性は ListView (や、GridViewExpandableListView などの他の AdapterView の子クラス) で使用されるもので、リスト項目やヘッダ、フッタとしてデザイン時に使用されるレイアウトを指定するものである。

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

Android StudioEclipse のレイアウトエディタで使用される。

Designtime Layout Attributes

Android Studio 0.2.11 からは、デザイン時にのみ使用されるレイアウト属性を指定することができるようになっています。

例えば、開発時には表示されるデータが決まっていないレイアウトの TextView に何からしらの文字を表示してレイアウトエディタで表示させたいことってよくありますよね。 そういう場合は、android:text の代わりに tools:text を使うことで、デザイン時にレイアウトエディタに表示させる文字列を指定できます。

        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            tools:text="タイトルです" />

もちろん、android:texttools:text の両方を指定することもできます。

tools:text に限らず、一般的に任意の Android フレームワークの属性 (android: 名前空間 (http://schemas.android.com/apk/res/android) に属する属性) と同じローカル名を持つ tools: 名前空間 (http://schemas.android.com/tools) の属性を使用することで、デザイン時にのみ有効な値を設定できます。

まとめ

  • サンプルコードや自動生成されるコードなどで見かける http://schemas.android.com/tools 名前空間XML 属性について説明しました。
  • 主に Lint での警告やエラーの抑制や、レイアウトエディタなどの挙動を変更するために使用されます。
  • 知らなくても開発はできますが、知っておくと便利そうな感じです。

関連記事