プログラムで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の直接の子として表示されます。何が悪いのですか?
答えをより明確にするために:
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
を渡すことになります
レイアウトパラメータにTableRowLayout、TableLayoutなどを指定する必要があることがわかりました。そうしないと、テーブルが表示されません。
良い解決策は、作成する行の各インスタンスのレイアウトファイルをインフレートすることです。この投稿を参照してください: ビューを複製してリストとテーブルに入力する方法
あなたの問題はこの行にあります:
b.setLayoutParams(new LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
LayoutParams
をTableRow.LayoutParams
に変更する必要があります:
b.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
私にとって、私のものを入手するには、addContentView()
を呼び出す必要がありました。