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

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

Это хорошо работает в режиме портрета, но терпит полный провал в альбомном режиме.

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

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

Расположение XML:




Java:

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);
    }
}
}

7
задан Brian Cooley 29 December 2009 в 21:02
поделиться

2 ответа

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

Я выяснил, что мне нужно было установить Layout_weight Talrewows к равным значениям. Но нет способа сделать это во время выполнения, поэтому я построил следующий файл макета, который я позвонил 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>

, затем я использовал макет для создания строки во время выполнения с свойствами, которые я хотел:

    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);
    }

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

4
ответ дан 7 December 2019 в 05:23
поделиться

Измените 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>

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

4
ответ дан 7 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

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