レイアウトを生成する
XMLでレイアウトを準備するというのは、レイアウトのデザインが簡単にできるという面で便利ですが、反面、静的なレイアウトしか使えないということにもなります。ダイナミックなレイアウトの生成などはXMLでは行えないでしょう。
そこで、「Javaのソースコード内からレイアウトを生成する」ということについてもやってみましょう。既に、ボタンやテキストビューといったコンポーネント類は、Javaのソースコード内では、あらかじめ用意されているクラスのインスタンスとして扱うようになっていることはわかりました。これは、レイアウトについても同様です。レイアウトも、それに相当するクラスが用意されており、そのインスタンスを生成することで新たにレイアウトを作成し、表示させることができます。
package jp.allabout.android;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.*;
import android.widget.*;
public class MyAndy extends Activity {
private Button main_btn;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
main_btn = (Button)this.findViewById(R.id.main_button);
main_btn.setOnClickListener(new MyClickAdapter());
}
// レイアウトの生成メソッド
public LinearLayout createLayout(){
LinearLayout layout = new LinearLayout(this);
TextView text = new TextView(this);
text.setText("これは、ダイナミックに生成されたレイアウトです。");
layout.addView(text,new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
return layout;
}
// イベントクラス
class MyClickAdapter implements OnClickListener {
@Override
public void onClick(View v) {
if (v == main_btn) {
setContentView(createLayout());
}
}
}
}
ここでは、ボタンをクリックしたらTextViewを1つだけ持つLinearLayoutを作成し、これを画面に表示させています。画面上はXMLで定義したレイアウトか、ダイナミックに生成されたものか区別はつかないでしょうが、その場で、コードでレイアウトが生成できるというのは、使い道次第によってはいろいろ利用方法がありそうですね。