義援金の受付

東日本大震災の
復興支援へのご寄付
をお願い致します。

a. レイアウトトリック:再利用可能な UI コンポーネントの作成


Android プラットフォームは、ユーザに複雑で便利なインターフェイスを提示するために、小さくて目に見えるブロック構造をつなぎ合わせ、広範囲にわたるさまざまな UI ウィジェットを提供しています。しかしながら、アプリケーションによってはもっと高レベルの視覚的なコンポーネントを要求されることがよくあります。その要求を満たしつつより効率的にそれを実現するために、複数の標準のウィジェットを再利用可能なコンポーネントとしてひとつにまとめることができます。

たとえば、キャンセルボタンのあるプログレスバー、2 つのボタン ( 肯定と否定のアクション ) があるひとつのパネル、アイコン、タイトル、説明などがいっしょになったパネルを再利用可能なコンポーネントとして作成することができます。カスタムの View を書くことにより UI コンポーネントを簡単に作成できますが、当然 XML を使っても簡単にできます。

Android の XML レイアウトファイルでは、各タグに実際のクラスのインスタンスが割り当てられます ( そのクラスは常に View のサブクラスです ) 。 また UI ツールキットには View インスタンスが割り当てられない <requestFocus /><merge /> および <include /> という 3 つの特別なタグがあります。この記事では、XML だけで可視化コンポーネントを作成した <include /> を使用する方法を説明します。<include /> と組み合わせることで特に威力を発揮する <merge /> を使用する方法についての情報は、レイアウトのマージ の記事を参照してください。

<include /> 要素はまさにその名の通りで、別の XML をインクルードするものです。以下の例は Android にある Home アプリケーションのソースコード からそのまま引用してきたものですが、ご覧のようにこのタグの使用は簡単です。

<com.android.launcher.Workspace
android:id="@+id/workspace"
android:layout_width="fill_parent"
android:layout_height="fill_parent"

launcher:defaultScreen="1">

<include android:id="@+id/cell1" layout="@layout/workspace_screen" />
<include android:id="@+id/cell2" layout="@layout/workspace_screen" />
<include android:id="@+id/cell3" layout="@layout/workspace_screen" />

</com.android.launcher.Workspace>

<include /> では、layout 属性のみが必須です。この属性は android 名前空間接頭辞は不要で、インクルードしたいレイアウトファイルの参照を指定します。この例では同じレイアウトが 3 回連続で並びます。このタグはインクルードされたレイアウトに上書き可能な属性がいくつかあります。上の例では、インクルードされたレイアウトのルートビューの id を特定する目的で android:id を使用することができるということを表しています。つまり、インクルードされたレイアウトの id を指定すればそれで上書きされます。同様にすべてのレイアウトパラメータを上書きすることができます。つまり、android:layout_* 属性であればどれでも <include /> で使用可能であるということです。以下はその例です。

<include android:layout_width="fill_parent" layout="@layout/image_holder" />
<include android:layout_width="256dip" layout="@layout/image_holder" />

このタグは UI のある一部分がデバイスの設定によるカスタマイズが必要となったときに特に便利です。例えば、アクティビティのメインのレイアウトを layout/ ディレクトリに配置しておき、layout-land/ と layout-port/ のふたつの特性で別のレイアウトを持たせることが可能です。こうすることでポートレートとランドスケープでの UI でほとんどの部分を共有することができます。