レイアウト リソース

レイアウト リソースは、Activity 内の UI のアーキテクチャや、UI のコンポーネントのアーキテクチャを定義します。

ファイルの場所:
res/layout/filename.xml
ファイル名はリソース ID として使用されます。
コンパイルされるリソースのデータ型:
View(またはサブクラス)リソースへのリソース ポインタ。
リソースの参照:
Java 内: R.layout.filename
XML 内: @[package:]layout/filename
構文:
<?xml version="1.0" encoding="utf-8"?>
<ViewGroup
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@[+][package:]id/resource_name"
    android:layout_height=["dimension" | "match_parent" | "wrap_content"]
    android:layout_width=["dimension" | "match_parent" | "wrap_content"]
    [ViewGroup-specific attributes] >
    <View
        android:id="@[+][package:]id/resource_name"
        android:layout_height=["dimension" | "match_parent" | "wrap_content"]
        android:layout_width=["dimension" | "match_parent" | "wrap_content"]
        [View-specific attributes] >
        <requestFocus/>
    </View>
    <ViewGroup >
        <View />
    </ViewGroup>
    <include layout="@layout/layout_resource"/>
</ViewGroup>

注: ルート要素としては、ViewGroup 要素、View 要素、<merge> 要素のいずれかを使用できますが、ルート要素は 1 つだけに限られます。また、android 名前空間を持つ xmlns:android 属性をルート要素に格納する必要があります。上記の構文をご覧ください。

要素:
<ViewGroup>
他の View 要素のコンテナ。ViewGroup オブジェクトにはさまざまな種類があり、それぞれが異なる方法で子要素のレイアウトを指定できます。ViewGroup オブジェクトの主な種類としては、LinearLayoutRelativeLayoutFrameLayout などがあります。

ViewGroup の種類によって、受け入れ可能なネストされたビューが異なります。たとえば、AdapterView クラス実装のビューグループの場合、子は Adapter から渡されたものだけに限られます。

属性:

android:id
リソース ID。要素を示す一意のリソース名。アプリから ViewGroup への参照を取得する際に使用します。詳しくは、android:id の値のセクションをご覧ください。
android:layout_height
ディメンションまたはキーワード。必須。グループの高さを、ディメンション値(ディメンション リソース)またはキーワード("match_parent" または "wrap_content")として指定します。詳しくは、android:layout_height と android:layout_width の値のセクションをご覧ください。
android:layout_width
ディメンションまたはキーワード。必須。グループの幅を、ディメンション値(ディメンション リソース)またはキーワード("match_parent" または "wrap_content")として指定します。詳しくは、android:layout_height と android:layout_width の値のセクションをご覧ください。

ViewGroup 基本クラスでは、ほかにもさまざまな属性がサポートされています。また、ViewGroup の各実装では、さらに多くの属性がサポートされています。利用可能なすべての属性のリファレンスについては、ViewGroup クラスの各リファレンス ドキュメント(たとえば、LinearLayout XML 属性)をご覧ください。

<View>
個々の UI コンポーネント。一般的にウィジェットと呼ばれます。View オブジェクトの主な種類としては、TextViewButtonCheckBox などがあります。

属性:

android:id
リソース ID。要素を示す一意のリソース名。アプリから View への参照を取得する際に使用します。詳しくは、android:id の値のセクションをご覧ください。
android:layout_height
ディメンションまたはキーワード。必須。要素の高さを、ディメンション値(ディメンション リソース)またはキーワード("match_parent" または "wrap_content")として指定します。詳しくは、android:layout_height と android:layout_width の値のセクションをご覧ください。
android:layout_width
ディメンションまたはキーワード。必須。要素の幅を、ディメンション値(ディメンション リソース)またはキーワード("match_parent" または "wrap_content")として指定します。詳しくは、android:layout_height と android:layout_width の値のセクションをご覧ください。

View 基本クラスでは、ほかにもさまざまな属性がサポートされています。また、View の各実装では、さらに多くの属性がサポートされています。詳細については、レイアウトをご覧ください。利用可能なすべての属性のリファレンスについては、各リファレンス ドキュメント(たとえば、TextView XML 属性)をご覧ください。

<requestFocus>
View オブジェクトを示す任意の要素内に、この空要素を格納することができます。これにより、親要素に画面上の初期フォーカスが与えられます。この要素は、ファイルごとに 1 つだけ指定することができます。
<include>
このレイアウトにレイアウト ファイルを組み込みます。

属性:

layout
レイアウト リソース。必須。レイアウト リソースへの参照。
android:id
リソース ID。組み込まれるレイアウト内のルートビューに付与されている ID をオーバーライドします。
android:layout_height
ディメンションまたはキーワード。組み込まれるレイアウト内のルートビューに付与されている高さをオーバーライドします。android:layout_width も宣言されている場合に限り有効になります。
android:layout_width
ディメンションまたはキーワード。組み込まれるレイアウト内のルートビューに付与されている幅をオーバーライドします。android:layout_height も宣言されている場合に限り有効になります。

組み込まれるレイアウト内のルート要素が他のレイアウト属性をサポートしている場合、そのレイアウト属性を <include> 内で指定することができます。指定した場合、ルート要素内で定義されている属性はオーバーライドされます。

注: <include> タグを使用してレイアウト属性をオーバーライドする場合、他のレイアウト属性を有効にするには、android:layout_heightandroid:layout_width の両方をオーバーライドする必要があります。

レイアウトを組み込む別の方法として、ViewStub を使用することもできます。これは、明示的にインフレートするまでレイアウト スペースを消費しない軽量のビューです。これを使用すると、android:layout 属性によって定義されているレイアウト ファイルが組み込まれます。ViewStub の使用方法については、オンデマンドでビューをロードするをご覧ください。

<merge>
レイアウト階層内に描画されない代替ルート要素。<merge> 要素の子を格納する親 View をすでに組み込んでいるレイアウト内に、このレイアウトを配置することを把握している場合は、この要素をルート要素として使用すると便利です。

この方法は、<include> を使用してこのレイアウトを別のレイアウト ファイル内に組み込む予定があり、このレイアウトが別の ViewGroup コンテナを必要としない場合に、特に便利です。レイアウトのマージの詳細については、<include> を使用してレイアウトを再利用するをご覧ください。

android:id の値

ID 値には通常、次の例のように "@+id/name" の構文形式を使用します。プラス記号(+)は、これが新しいリソース ID であることを示し、aapt ツールが R.java クラス内に新しいリソース整数を作成します(まだ存在しない場合)。

<TextView android:id="@+id/nameTextbox"/>

nameTextbox 名は、この要素にアタッチされたリソース ID です。これにより、Java 内で、ID が関連付けられている TextView を参照できるようになります。

Kotlin

val textView: TextView? = findViewById(R.id.nameTextbox)

Java

TextView textView = findViewById(R.id.nameTextbox);

このコードは、TextView オブジェクトを返します。

すでに ID リソースを定義済みの場合(そして、まだ使用していない場合)は、android:id 値内のプラス記号を除外することで、その ID を View 要素に適用できます。

android:layout_height と android:layout_width の値

高さと幅の値は、Android でサポートされているディメンション単位(px、dp、sp、pt、in、mm)を使用するか、以下のキーワードを使用して表現します。

説明
match_parent 親要素のディメンションと一致するようにディメンションを設定します。サポートが終了した fill_parent の後継として、API レベル 8 で追加されました。
wrap_content この要素のコンテンツに適合するうえで必要最小限のサイズに設定します。

カスタムビュー要素

カスタム View 要素やカスタム ViewGroup 要素を作成して、標準レイアウト要素と同じようにレイアウトに適用することができます。また、XML 要素でサポートされている属性を指定することもできます。詳細については、カスタムビュー コンポーネントを作成するをご覧ください。

例:
res/layout/main_activity.xml に保存された XML ファイル:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello, I am a TextView" />
    <Button android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello, I am a Button" />
</LinearLayout>

次のアプリコードは、onCreate() メソッド内で、Activity のレイアウトをロードします。

Kotlin

public override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)
}

Java

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
}
関連項目: