2011年9月17日土曜日

LinearLayout (動的に生成する #2)

これまでにLinearLayoutを動的に生成する方法画面のサイズを取得する方法をご紹介しました。今回はそれらを組み合わせて、画面サイズに適したレイアウトにしてみましょう。


画面サイズを考慮しないと…

まずは画面の幅を気にせずに表示するとどうなるか確認します。
文字列の表示にはTextViewを使い、幅は80ピクセルにします。"Text 0"から"Text 19"までを横に並べて表示してみましょう。

Androidプロジェクトの設定
プロジェクト名LinearLayoutTest3a
ビルドターゲットAndroid 2.1-update1
アプリケーション名LinearLayoutTest3a
パッケージ名jp.co.triware.samples.LinearLayoutTest3a
アクティビティーの作成LinearLayoutTest3a
最小SDKバージョン7
LinearLayoutTest3a.java
package jp.co.triware.samples.LinearLayoutTest3a;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.LinearLayout;
import android.view.Gravity;

public class LinearLayoutTest3a extends Activity {
    private static final int itemHeight = 40;
    private static final int itemWidth = 80;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout llHorizontal = new LinearLayout(this);
        llHorizontal.setOrientation(LinearLayout.HORIZONTAL);
        llHorizontal.setGravity(Gravity.CENTER_HORIZONTAL);

        for (int i = 0; i < 20; i ++) {
            TextView tv = new TextView(this);
            tv.setHeight(itemHeight);
            tv.setWidth(itemWidth);
            tv.setGravity(Gravity.CENTER);
            tv.setText("Text " + i);
            llHorizontal.addView(tv);
        }

        setContentView(llHorizontal);
    }
}
実行結果
"Test 4"から"Test 19"までがはみ出してしまいました。


画面サイズにあわせる

次に、画面の幅によって文字列を置く個数を変更してみます。画面の幅はDisplayクラスのgetWidth()メソッドで求めます。

Androidプロジェクトの設定
プロジェクト名LinearLayoutTest3b
ビルドターゲットAndroid 2.1-update1
アプリケーション名LinearLayoutTest3b
パッケージ名jp.co.triware.samples.LinearLayoutTest3b
アクティビティーの作成LinearLayoutTest3b
最小SDKバージョン7
LinearLayoutTest3b.java
package jp.co.triware.samples.LinearLayoutTest3b;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.TextView;

public class LinearLayoutTest3b extends Activity {
    private final String TAG = this.getClass().getSimpleName();

    private static final int itemHeight = 40;
    private static final int itemWidth = 80;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 縦方向
        LinearLayout llVertical = new LinearLayout(this);
        llVertical.setOrientation(LinearLayout.VERTICAL);
        llVertical.setGravity(Gravity.CENTER_HORIZONTAL);

        // 横幅
        Display display = getWindowManager().getDefaultDisplay();
        int displayWidth = display.getWidth();
        Log.d(TAG, "height: " + display.getHeight());
        Log.d(TAG, "width : " + displayWidth);
        Log.d(TAG, "N/line: " + (displayWidth / itemWidth));

        // 横方向
        LinearLayout llHorizontal = null;
        int nextPos = displayWidth;
        for (int i = 0; i < 20; i ++) {
            // テキスト
            TextView tv = new TextView(this);
            tv.setHeight(itemHeight);
            tv.setWidth(itemWidth);
            tv.setGravity(Gravity.CENTER);
            tv.setText("Text " + i);
            // 次の行?
            nextPos += itemWidth;
            if (nextPos > displayWidth) {
                llHorizontal = new LinearLayout(this);
                llHorizontal.setOrientation(LinearLayout.HORIZONTAL);
                llHorizontal.setGravity(Gravity.LEFT);
                llVertical.addView(llHorizontal);
                nextPos = itemWidth;
            }
            // 追加
            llHorizontal.addView(tv);
        }

        setContentView(llVertical);
    }
}
実行結果
縦長でも横長でも画面のサイズにあわせてきっちり収まるようになりました。

0 件のコメント:

コメントを投稿