【Android】Viewのレイアウトをコードで指定する

投稿者: | 2011年4月20日

Viewを配置するにはレイアウトxmlを記述するか、コードで記述するかのどちらかとなる。
通常の場合はレイアウトxmlを記述したほうがコーディングの効率はいいと思うが、
カスタムView内で子Viewを規則的に配置したい場合などではコードを書いた方が効率的なこともありうる。
そこで、こちらの方法も知っておくと便利である。

xmlの「android:layout_…」に相当するのはLayoutParamsというクラスで、
このクラスのインスタンスに対して各種の値を設定し、setLayoutParams()メソッドで
対象のViewにセットすればよい。

サンプルコードは10個のボタンを規則的に並べただけのカスタムViewである。
一応、リスナーを定義してあって、イベントでどの数字が押されたかを知ることができるようになっている。

NumberButtonView.java

public class NumberButtonView extends LinearLayout {

	public interface OnNumberPushedListener{
		public void onNumberPushed(int num);
	}

	private OnNumberPushedListener listener;

	public void setOnNumberPushedListener(OnNumberPushedListener listener){
		this.listener = listener;
	}

	public NumberButtonView(Context context, AttributeSet attrs) {
		super(context, attrs);

		// ボタンに登録するリスナー
		final OnClickListener clicked = new OnClickListener(){

			@Override
			public void onClick(View v) {
				if(listener!=null){
					listener.onNumberPushed((Integer)v.getTag());
				}
			}
		};


		// android:orientation="vertical" に相当
		setOrientation(VERTICAL);

		/*
			android:layout_width="fill_parent"
		    android:layout_height="wrap_content"
		    android:layout_weight="1"
		    に相当するパラメータを作成
		*/
		final LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
		params.weight = 1.f;

		for( int i=0; i<10; i++ ){
			final Button b = new Button(context);

			b.setText(Integer.toString(i));
			b.setTag(i);
			b.setLayoutParams(params);
			b.setOnClickListener(clicked);

			addView(b);
		}
	}
}

MainActivity.java

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ((NumberButtonView)findViewById(R.id.numberButtonView)).setOnNumberPushedListener(new OnNumberPushedListener() {

			@Override
			public void onNumberPushed(int num) {

				Toast.makeText(MainActivity.this, num + " pushed.", Toast.LENGTH_SHORT).show();
			}
		});
    }
}

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"
    >
<com.lesson.layoutcode.NumberButtonView
	android:id="@+id/numberButtonView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />
</LinearLayout>

実行結果は以下のようになる。

【Android】Viewのレイアウトをコードで指定する」への1件のフィードバック

  1. Yutchy

    android:minHeightや
    android:maxHeight

    に相当するのは なになんでしょうか?

    返信お待ちしております。

    返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です