Какой класс LayoutParams импортировать при работе с TableLayout?

#java #android

#java #Android

Вопрос:

Я добавляю строки в a TableLayout программно, перебирая an ArrayList . В настоящее время столбцы таблицы установлены WRAP_CONTENT равными и из-за этого не растягиваются, чтобы занимать всю ширину устройства.

Пройдя несколько потоков SO, я нашел этот фрагмент кода:

 LayoutParams lparams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
 

При использовании Alt Enterпоявляется длинный список классов, и я не уверен, какой класс импортировать.

Файл активности

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/activity_feed_history"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="abc.def.FeedHistory">

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="14dp"
        android:id="@ id/todayTable">
    </TableLayout>
</RelativeLayout>
 

Java-файл

 .
.
TableLayout table = (TableLayout) findViewById(R.id.todayTable);
TableRow row = new TableRow(this);
row.setLayoutParams(lparams);

TextView textView= new TextView(this);
textView.setText("Row Text);
textView.setLayoutParams(lparams);
row.addView(textView);
table.addView(row);
 

К вашему сведению

Я уже пробовал TableLayout.LayoutParams , ViewGroup.LayoutParams , и RelativeLayout.LayoutParms . Все это приводит к тому, что таблица исчезает при просмотре в эмуляторе.

Ожидаемый

Комментарии:

1. всегда один из внешнего контейнера

2. Итак, в данном случае RelativeLayout , поскольку это корневой элемент? Но я уже пробовал с этим и получил пустой экран.

3. TableLayout Нужны представления TableLayout.LayoutParams . Другими словами, первый выбор прямо вверху — Android Studio / IntelliJ очень умен, когда дело доходит до выяснения throw-материала для вас.

4. если вы хотите вызвать setLayoutParams TableLayout , чем это правильно

Ответ №1:

Безопаснее LayoutParams всего импортировать в другие макеты ViewGroup.LayoutParams . Причина в том, что все представления будут размещены внутри ViewGroup , потому что все макеты ViewGroups .

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

В случае a TableLayout вы бы создали свой TableRow , а затем передали TableLayout.LayoutParams его следующим образом:

 TableLayout layout = methodToGetLayout();

TableLayout.LayoutParams lp = new TableLayout.LayoutParmas(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER;
lp.layout_weight = 1;

TableRow row = new TableRow(context);
row.setLayoutParams(lp);
 

Таким образом, в этом случае вы можете вручную задать параметры LAYOUT, специфичные для a TableLayout.LayoutParams , которые не существуют в общем ViewGroup.LayoutParams . Если вам это не нужно, то вы можете придерживаться универсального ViewGroup.LayoutParams и все будет в порядке.

Ответ №2:

Попробуйте это:

 final TableRow row = new TableRow(context);

TextView textView = new TextView(context);
textView.setText("0");
  textView.setLayoutParams(new TableRow.LayoutParams(0, TableLayout.LayoutParams.MATCH_PARENT, 1));
row.addView(textView, 0);
 

Комментарии:

1. Похоже, это работает. Не могли бы вы объяснить, что там происходит?