Я борюсь с ужасной системой расположения 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. Я попробовал миллион комбинаций LayoutParams, но ничто никогда не работает. Это - лучший результат, который я имею, который только заполняет ширину экрана, не высоту:
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
внутри вертикальных. Ключевым моментом является установка веса. Если вы укажете 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);
Вы никогда не устанавливаете параметры макета строки или кнопки, тогда как в опубликованном xml вы делаете это ... изменяете детали циклов for, чтобы установить макет строки параметры и параметры макета кнопки, чем он должен дать тот же результат, что и ваш xml.
Нашел ответ: очевидно, это layout_weight, который заставляет его работать, и нет возможности установить его из Java. Черт.
См. Как я могу заставить Android TableLayout заполнить родительский элемент в альбомном режиме?