Как я могу заставить Android TableLayout заполнять экран?

Я борюсь с ужасной системой расположения 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 не является никакой справкой. У кого-либо есть какие-либо идеи?

28
задан Chris Martin 16 July 2015 в 08:57
поделиться

3 ответа

Наконец-то выяснилось, как это сделать. Отказался от 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);
8
ответ дан 28 November 2019 в 03:24
поделиться

Вы никогда не устанавливаете параметры макета строки или кнопки, тогда как в опубликованном xml вы делаете это ... изменяете детали циклов for, чтобы установить макет строки параметры и параметры макета кнопки, чем он должен дать тот же результат, что и ваш xml.

0
ответ дан 28 November 2019 в 03:24
поделиться

Нашел ответ: очевидно, это layout_weight, который заставляет его работать, и нет возможности установить его из Java. Черт.

См. Как я могу заставить Android TableLayout заполнить родительский элемент в альбомном режиме?

1
ответ дан 28 November 2019 в 03:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: