私はAndroidのひどいレイアウトシステムと戦っています。テーブルを画面いっぱいに表示しようとしていますが(簡単でしょ?)、それはとんでもなく難しいです。
私はそれを次のようにXMLで何らかの形で機能させることができました。
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:layout_height="fill_parent" Android:layout_width="fill_parent">
<TableRow Android:layout_height="fill_parent" Android:layout_width="fill_parent" Android:layout_weight="1">
<Button Android:text="A" Android:layout_width="wrap_content" Android:layout_height="fill_parent" Android:layout_weight="1"/>
<Button Android:text="B" Android:layout_width="wrap_content" Android:layout_height="fill_parent" Android:layout_weight="1"/>
</TableRow>
<TableRow Android:layout_height="fill_parent" Android:layout_width="fill_parent" Android:layout_weight="1">
<Button Android:text="C" Android:layout_width="wrap_content" Android:layout_height="fill_parent" Android:layout_weight="1"/>
<Button Android:text="D" Android:layout_width="wrap_content" Android:layout_height="fill_parent" Android:layout_weight="1"/>
</TableRow>
ただし、Javaで動作させることはできません。私は100万通りのLayoutParamの組み合わせを試しましたが、何も機能しません。これは私が持っている最高の結果であり、高さではなく、画面の幅を埋めるだけです:
table = new TableLayout(this);
// Java. You suck.
TableLayout.LayoutParams lp = new TableLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
table.setLayoutParams(lp); // This line has no effect! WHYYYY?!
table.setStretchAllColumns(true);
for (int r = 0; r < 2; ++r)
{
TableRow row = new TableRow(this);
for (int c = 0; c < 2; ++c)
{
Button btn = new Button(this);
btn.setText("A");
row.addView(btn);
}
table.addView(row);
}
明らかにAndroidのドキュメントは役に立ちません。だれでも何かアイデアがありますか?
最後にこれを行う方法を考え出しました。 TableLayout
をあきらめ、垂直方向の内部で水平方向のLinearLayout
sを使用しました。重要なキーは、重みを設定することです。 FILL_PARENT
を指定しても、デフォルトのウェイトでは機能しません。
LinearLayout buttonsView = new LinearLayout(this);
buttonsView.setOrientation(LinearLayout.VERTICAL);
for (int r = 0; r < 6; ++r)
{
LinearLayout row = new LinearLayout(this);
row.setOrientation(LinearLayout.HORIZONTAL);
for (int c = 0; c < 4; ++c)
{
Button btn = new Button(this);
btn.setText("A");
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
lp.weight = 1.0f;
row.addView(btn, lp);
}
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);
lp.weight = 1.0f;
buttonsView.addView(row, lp);
}
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
setContentView(buttonsView, lp);
上記の説明には2つの誤りがあります。
TableLayout.LayoutParams
とTableRow.LayoutParams
を指定し、適切なコンストラクターを使用することで、プログラムで重みを設定できます。
TableLayout.LayoutParams rowInTableLp = new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1.0f);
ウィジェットには、その親のLayoutParams
が必要です。したがって、行はTableLayout.LayoutParams
を使用する必要があります。
これにより、初期コードの次の作業バージョンが提供されます。
TableLayout table = new TableLayout(this);
// Java. You succeed!
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
table.setLayoutParams(lp);
table.setStretchAllColumns(true);
TableLayout.LayoutParams rowLp = new TableLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT,
1.0f);
TableRow.LayoutParams cellLp = new TableRow.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT,
1.0f);
for (int r = 0; r < 2; ++r)
{
TableRow row = new TableRow(this);
for (int c = 0; c < 2; ++c)
{
Button btn = new Button(this);
btn.setText("A");
row.addView(btn, cellLp);
}
table.addView(row, rowLp);
}
setContentView(table);
Android ソリューションに関する開発者向けフォーラム )に関するRomain Guyのコメントに感謝します。
答えが見つかりました。どうやら、それを機能させるのはlayout_weightであり、Javaから設定する方法はありません。畜生。
行またはボタンのレイアウトパラメーターを設定することはありませんが、投稿されたxmlではそれを行います。forループの詳細を変更して、行レイアウトパラメーターとボタンレイアウトパラメーターの両方を設定すると、xmlと同じ結果が得られます。
TableLayout LayoutParamsを設定するには、論理的にはTableLayout.LayoutParamsクラスの使用を想定していますが、TableLayout.LayoutParamsをFrameLayout.LayoutParamsにキャストできないことを示すキャストエラーが発生します。
したがって、プログラムでTableLayoutプロパティを設定する場合は、FrameLayout.LayoutParamsを使用する必要があります。例えば:
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT,TableLayout.LayoutParams.MATCH_PARENT);
layoutParams.setMargins(80, 0, 0, 0);
TableLayout tableLayout = (TableLayout) findViewById(R.id.header_detail);
tableLayout.setLayoutParams(layoutParams);