テーブルレイアウト (TableLayout) の行を動的に追加

テーブルレイアウト (TableLayout) では、各行 (TableRow) を main.xml ファイルに定義しましたが、 同じレイアウトの行をプログラムで動的に追加することもできます。
あらかじめ行のレイアウトを xml ファイルに定義し、これを使用してプログラムで行を追加する方法を説明します。

テーブルレイアウトを定義するファイルを、main.xml、行レイアウトを定義するファイルを table_row.xml として説明します。

table_row.xml の定義

テーブルの行レイアウトを定義する talbe_row.xml ファイルに以下を記述します。

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView />
    <EditText />
    <Button />

</TableRow>

各行に表示する要素を設定します。この場合、各行には、「テキスト表示 | 編集テキスト | ボタン」が表示されることになります。

main.xml の定義

テーブルレイアウトを定義する main.xml ファイルに以下を記述します。

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/TableLayout1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:stretchColumns="1">
    
</TableLayout>

ここでは、TableLayout のみを定義します。行はプログラムで追加するため、ここではなにもない状態です。

行を動的に追加

TableLayoutに行を追加するには、getLayoutInflater().inflate() を使用します。
また、各行のテキスト、ボタン等の文字もここで設定します。
テーブルレイアウト (TableLayout) の ViewGroup を取得し、各行の要素は getChildAt を使用して取得します。

public class TableLayoutSampleActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        // TableLayoutのグループを取得
        ViewGroup vg = (ViewGroup)findViewById(R.id.TableLayout1);
        
        for (int i=0; i<3; i++) {
            // 行を追加
            getLayoutInflater().inflate(R.layout.table_raw, vg);
            // 文字設定
            TableRow tr = (TableRow)vg.getChildAt(i);
            String str = String.format(Locale.getDefault(), "raw%d", i+1);
            ((TextView)(tr.getChildAt(0))).setText(str);
            ((EditText)(tr.getChildAt(1))).setHint(str);
            ((Button)(tr.getChildAt(2))).setText(str);
        }
        
    }
}

getLayoutInflater().inflate(R.layout.行を定義したxmlファイル名称, 追加対象のViewグループ)
とすることで、TableLayout にxmlで定義したレイアウトの行を追加することができます。


テーブルレイアウト (TableLayout) 関連の記事

 ⇒ テーブルレイアウト (TableLayout) の使い方
 ⇒ 行を別の xml で定義