web-dev-qa-db-ja.com

プログラムでTableLayoutを作成する

プログラムでTableLayoutを作成しようとしています。うまくいきません。ただし、xmlファイルの同じレイアウトは機能します。これは私が持っているものです:

public class MyTable extends TableLayout
{
    public MyTable(Context context) {
        super(context);

        setLayoutParams(new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        TableRow row = new TableRow(context);
        row.setLayoutParams(new TableRow.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        Button b = new Button(getContext());
        b.setText("hello");
        b.setLayoutParams(new LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
        row.addView(b); 
        addView(row)
    }
}

...

// In main activity:
MyTable table = new MyTable(this);
mainLayout.addView(table);

これを実行すると、クラッシュは発生しませんが、何も表示されません。 TableRowインスタンスを取り除くと、少なくともボタンはTableLayoutの直接の子として表示されます。何が悪いのですか?

25
mark

答えをより明確にするために:

TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT);
TableRow.LayoutParams rowParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT);

TableLayout tableLayout = new TableLayout(context);
tableLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));// assuming the parent view is a LinearLayout

TableRow tableRow = new TableRow(context);
tableRow.setLayoutParams(tableParams);// TableLayout is the parent view

TextView textView = new TextView(context);
textView.setLayoutParams(rowParams);// TableRow is the parent view

tableRow.addView(textView);

説明
setLayoutParamsを呼び出すと、親ビューのLayoutParamsを渡すことになります

34
Grigori A.

レイアウトパラメータにTableRowLayout、TableLayoutなどを指定する必要があることがわかりました。そうしないと、テーブルが表示されません。

6
mark

良い解決策は、作成する行の各インスタンスのレイアウトファイルをインフレートすることです。この投稿を参照してください: ビューを複製してリストとテーブルに入力する方法

1
clotilde

あなたの問題はこの行にあります:

b.setLayoutParams(new LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));

LayoutParamsTableRow.LayoutParamsに変更する必要があります:

b.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
0
ericn

私にとって、私のものを入手するには、addContentView()を呼び出す必要がありました。

0
John Moses