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

プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

【Android】XMLファイルからViewを生成する

『ちょっとだけ立体風地図ビューワ』の画面を作る際に、一部をソース内で動的に生成し、一部をXMLファイルにより定義し、この両者を組み合わせています。

このためには、XMLファイルから、動的にViewオブジェクトを得るには、

View v = this.getLayoutInflater().inflate(R.layout.main, null);

とします。このあと、

setContentView(v)

と呼べばOKです。これは、よくサンプルで見かけるように、

setContentView(R.layout.main);

としているのと同じことになります。

たとえば、下記のXMLファイル(main.xml)に対して、

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>

このようなサンプルコードを実行すると、

package com.mori_soft.android.inflatetest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;

public class InflateTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.main);
        
        View v = this.getLayoutInflater().inflate(R.layout.main, null);
        
        setContentView(v);
    }
}

setContentViewで直接リソースIDを指定した場合と同じように動作します。

コードでinflateとsetContentViewが分かれると、Viewオブジェクトのパラメータを設定したり、inflateして得られたオブジェクトを別のViewに入れたり、必要に応じていろいろな操作が可能になるので、柔軟にViewを構成することができると思います。

また、類似の方法として、View.inflateメソッド(staticメソッド)を使っても同様のことができるようです(試してはいません)。

 

ちなみに、上記に書いた方法で、

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />

のようなTextViewだけをXMLファイルに書いたもので試してみると、inflate後、動的に作ったLinearLayoutを組み合わせよ うとしても、うまくできませんでした。

XMLファイルのルート要素がViewGroupでないといけないのか?それとも別の理由なのか?現時点ではまだよくわかりません。そんな状態ですので、使う場合はご自分でもいろいろと試してみるといいと思います。

ご参考までに。

 

(参考にしたサイト)

Android XML View inflation

How to inflate an xml ? (上記のサイトのメソッド名とかは古いようです。こちらの質問者がViewInflateがない、と言っています。 )

以上