Как я могу заставить Android TableLayout заполнить родителя в ландшафтном режиме?

Я использую TableLayout в своем приложении. Он содержит четыре TableRows, каждый из которых содержит четыре ImageView. Поведение, которое я хочу, состоит в том, чтобы масштабировать макет, чтобы он соответствовал кратчайшему измерению.

Он отлично работает в портретном режиме, но с треском проваливается в ландшафтном режиме.

Из документации это выглядит так, потому что layout_height TableRow всегда установлен в WRAP_CONTENT. Хотя я могу установить размеры отдельных представлений, TableLayout вообще не будет отображаться, если я установлю для View layout_height значение FILL_PARENT.

Я чувствую, что мне не хватает чего-то простого. Есть ли способ заставить TableLayout с TableRows масштабироваться, чтобы соответствовать высоте в ландшафтном режиме?

XML-макет:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/table"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:shrinkColumns="*">
</TableLayout>

Ява:

public class Example extends Activity {

private TableLayout mTable;
private int[] mDrawableIds = {  R.drawable.draw01, R.drawable.draw02, R.drawable.draw03, R.drawable.draw04, R.drawable.draw05, R.drawable.draw06,   R.drawable.draw07, R.drawable.draw08, R.drawable.draw09, R.drawable.draw10, R.drawable.draw11, R.drawable.draw12, R.drawable.draw13, R.drawable.draw14, R.drawable.draw15, R.drawable.draw16 };

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mTable = (TableLayout)findViewById(R.id.table);
    for (int j=0; j<4; j++) {
        TableRow tr = new TableRow(this);
        tr.setLayoutParams(new ViewGroup.LayoutParams(  LayoutParams.FILL_PARENT,
                LayoutParams.WRAP_CONTENT));
           for (int i=0; i<4; i++) {
               ImageView iv = new ImageView(this);
               iv.setImageResource(mDrawableIds[j*4+i]);
               iv.setScaleType(ImageView.ScaleType.FIT_CENTER);
               iv.setAdjustViewBounds(true);
               tr.addView(iv);
           }
        mTable.addView(tr);
    }
}
}

person Brian Cooley    schedule 27.12.2009    source источник
comment
GridView не работает для вашего варианта использования? Учебник по GridView здесь: developer.android.com/guide/tutorials/views/ привет-gridview.html   -  person Roman Nurik    schedule 29.12.2009
comment
GridView, похоже, хочет прокручивать, а не изменять размер ImageViews в альбомной ориентации. Возможно, если бы я уменьшил ресурсы изображения, это могло бы сработать. Я надеялся избежать изменения размера изображений.   -  person Brian Cooley    schedule 29.12.2009


Ответы (3)


Измените макет XML на:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/table"
        android:layout_width="fill_parent"
        android:layout_height="160dp"
        android:shrinkColumns="*">
</TableLayout>

Это должно заставить его занимать всю высоту экрана независимо от ориентации. См. пиксели, не зависящие от плотности.

person Dinedal    schedule 29.12.2009

Я понял, как это сделать. По сути, часть, которая не работала так, как я хотел, — это TableRows. Когда я перешел на альбомную ориентацию, первые два TableRows вообще не меняли размер, а третий занимал оставшееся пространство. Четвертая строка вообще не отображалась.

Я понял, что мне нужно установить равные значения layout_weight для TableRows. Но нет способа сделать это во время выполнения, поэтому я создал следующий файл макета, который я назвал row.xml:

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/trow"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_weight="1">
</TableRow>

Затем я использовал LayoutInflater для создания строки во время выполнения с нужными мне свойствами:

    mTable = (TableLayout)findViewById(R.id.table);
    LayoutInflater inflater = getLayoutInflater();

    for (int j=0; j<4; j++) {
        View row = inflater.inflate(R.layout.row, mTable,false);
        TableRow tr = (TableRow)row.findViewById(R.id.trow);
           for (int i=0; i<4; i++) {
               View image = inflater.inflate(R.layout.image, tr, false);
               ImageButton ib = (ImageButton)image.findViewById(R.id.image);
               ib.setAdjustViewBounds(true);
               ib.setImageResource(mCardIds[j*4+i]);
               tr.addView(ib);
           }
        mTable.addView(tr);
    }

Теперь TableRows правильно изменяют размер при вращении. Я изменил ImageViews на ImageButtons, потому что решил добавить некоторое поведение onClick, и я создаю эти кнопки с помощью отдельного XML-файла, но я не думаю, что эти детали имеют отношение к проблеме изменения размера.

person Brian Cooley    schedule 17.01.2010
comment
добавление android:layout_weight="1" к каждому столбцу в строке заголовка таблицы решило мою проблему, хорошо - person knownUnknown; 30.01.2017

Я попробовал принятое здесь решение, но оно не сработало. Что сработало, как показано ниже:

TableRow tr = new TableRow(this);
TableLayout.LayoutParams pRowTop = new TableLayout.LayoutParams(
                TableLayout.LayoutParams.MATCH_PARENT,
                TableLayout.LayoutParams.WRAP_CONTENT);
pRowTop.weight = 1;
mTable.addView(tr, pRowTop);
person user846316    schedule 22.11.2015