LinearLayoutによるレイアウト配置

Androidには、複数のView(コンポーネント)を格納する「コンテナ」の基本クラスとして、ViewGroupが用意されています。ViewGroupは、複数のViewを追加し管理するための基本的な機能を実装するクラスですが、サブクラスとして追加されたコンポーネントを各種のレイアウトに沿って配置するレイアウト系のクラスやリストビューなども用意されています。

今回は、一定のルールでViewを配置できるレイアウトの基本機能を確認するために、追加されたViewを横(または縦)一列に配置していくレイアウトコンポーネントLinearLayoutを使ってみましょう。

LinearLayoutの基本的な使い方は、コンストラクタで作成したらaddView()メソッドでViewを追加していく、というものです。たとえば、ボタンを二つLinearLayoutで配置するAndroidアプリ(Activityクラス)なら、以下のようになります。

import android.widget.*;
import android.app.Activity;
import android.os.Bundle;

public class LinearLayoutTestActivity extends Activity {

	private LinearLayout testLayout = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {

    	super.onCreate(savedInstanceState);

    	testLayout = new LinearLayout(this);
    	setContentView(testLayout);

    	Button btn1 = new Button(this);
    	btn1.setText("button1");

    	testLayout.addView(btn1);

    	Button btn2 = new Button(this);
    	btn2.setText("button2");

    	testLayout.addView(btn2);

    }

}

Android SDKのエミュレータで実行すると、横方向にボタンが配置されますが、配置方向はsetOrientation()メソッドで設定できます。たとえば、LinearLayoutオブジェクトtestLayoutを作成した後に

testLayout.setOrientation(LinearLayout.VERTICAL);

とすると、縦方向に配置できるわけです。

ただ、ボタンを追加して試してみると横方向いっぱいに引き伸ばされてしまいますね……。ボタンのラベルにあわせてサイズを調整する場合は、addView()の引数としてLayoutParamsを追加し、配置方法を指定してやります。

testLayout.addView(btn2, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));

LinearLayoutで垂直方向に並べる場合、デフォルトでは、左端を合わせる形で配置されます。この配置位置もsetGravity()メソッドで調整が可能です。たとえば、中央に寄せるなら以下のようにします。

testLayout.setGravity(android.view.Gravity.CENTER);

LinearLayoutなどViewGroupのサブクラスは、内部にさらにViewGroupを追加できるので、setGravity()をうまく使えば、かなり複雑なレイアウトもLinearLayoutだけで実現できそうです。

Androidアプリは、スマートフォン、タブレット、さらにパソコンやネットテレビなど多様な画面環境(サイズ、解像度)で実行される可能性があります。なるべく特定の画面サイズ、ピクセル数に依存せず多くの端末でそれなりの画面構成を実現するためにも、Androidのレイアウトの仕組みに慣れておきたいところです。


創作プログラミングの街