『ちょっとだけ立体風地図ビューワ』の画面を作る際に、一部をソース内で動的に生成し、一部を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でないといけないのか?それとも別の理由なのか?現時点ではまだよくわかりません。そんな状態ですので、使う場合はご自分でもいろいろと試してみるといいと思います。
ご参考までに。
(参考にしたサイト)
How to inflate an xml ? (上記のサイトのメソッド名とかは古いようです。こちらの質問者がViewInflateがない、と言っています。 )
以上