AndroidでLayoutを動的に差し替える

res/layout/xxxx.xmlで定義された画面の中の一部分を動的に差し替えるとこが出来る。

たとえば、ヘッダーとフッター部分はそのままで、ボタンを押されたら内容の部分だけ切り替えて表示するという感じ。


LayoutInflaterクラスのinflaterメソッドを使う。

http://developer.android.com/reference/android/view/LayoutInflater.html



まずは、差し替えられる側のxmlを作る。

以下の例ではタイトル、コンテンツ部分、ボタンで構成れていて、ボタンが押された時に、コンテンツ部分を別のものへ差し替える事を想定している。


例)res/layout/test.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/test_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="タイトル" />
    <LinearLayout
        android:id="@+id/test_contents"
        android:layout_width="500dip"
        android:layout_height="300dip"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="1ページ目です"
            />
    </LinearLayout>
    <Button
        android:id="@+id/test_next"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="NEXT" />
</LinearLayout>


差し替える側のxmlも作る。

こちらはコンテンツ部分だけを記述する。

 

例)res/layout/test_sub.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/test_contents"
        android:layout_width="500dip"
        android:layout_height="300dip"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="2ページ目です"
            />
</LinearLayout>


ボタンが押された時にページを差し替える処理をする。

public void onClick(View v) {
        // コンテンツ部分のLayoutを取ってくる
        LinearLayout layout = (LinearLayout)findViewById(R.id.test_contents);
        
        // 内容を全部消す
        layout.removeAllViews();

        // test_sub.xmlに変更する
        getLayoutInflater().inflate(R.layout.test_sub, layout);
}