TableLayout не будет соответствовать ширине LinearLayout_parent

Мне нужно, чтобы TableLayout соответствовал ширине родительского LinearLayout, но я не могу заставить его работать.

На первом снимке экрана ниже «Короткий заголовок» — это первое представление в вертикальном LinearLayout. «Поля» ниже являются членами TableLayout, который является вторым представлением в вертикальном LinearLayout.

Когда текст «Заголовок» не требует такой ширины, как TableLayout, все выравнивается по назначению.

Когда «Заголовок» требует большей ширины, чем TableLayout, TableLayout не соответствует_ширине с «Заголовком», как вы можете видеть на втором снимке экрана.

Как сделать так, чтобы TableLayout соответствовал ширине LinearLayout?

Примечание. Базовый LinearLayout должен "переноситься" на наименьшую ширину, необходимую для отображения его содержимого, поэтому установка фиксированной ширины не является решением

Короткий заголовок

Длинный заголовок

XML макета для этого теста:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mainLayout"
    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=".MainActivity" >

    <LinearLayout 
       android:id="@+id/baseLinerLayout"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:orientation="vertical"
       android:background="#FFAAAAAA" >

       <TextView
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:gravity="center"
           android:padding="10dp"
           android:background="#FF000000"
           android:textColor="#FFFFFFFF"
           android:text="Long header to make base layout wider than table layout" />

          <TableLayout 
            android:id="@+id/tableLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#33FFFFFF" >

            <TableRow
                android:id="@+id/tableRow1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >

                <TextView
                    android:gravity="center"
                    android:padding="10dp"
                    android:background="#44FFFFFF"
                    android:textColor="#FF000000"
                    android:text="Field (0,0)" />

                <TextView
                    android:gravity="center"
                    android:padding="10dp"
                    android:background="#88FFFFFF"
                    android:textColor="#FF000000"
                    android:text="Field (0,1)" />

            </TableRow>

            <TableRow
                android:id="@+id/tableRow2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >

                <TextView
                    android:gravity="center"
                    android:padding="10dp"
                    android:background="#88FFFFFF"
                    android:textColor="#FF000000"
                    android:text="Field (0,1)" />

            </TableRow>
        </TableLayout>
   </LinearLayout>
</RelativeLayout>

person Sound Conception    schedule 15.11.2013    source источник


Ответы (3)


Поскольку вы используете TextViews без установленной ширины, я бы предложил установить для параметра android:layout_width всех ваших полей значение match_parent.

редактировать: зачем вам второй LinearLayout? Это кажется бесполезным, потому что он только оборачивает TableLayout.

person Marcin Milejski    schedule 15.11.2013
comment
Спасибо за ваше предложение. К сожалению, я уже играл с установкой ширины макета полей на match_parent или wrap_content, но это не дало никакого эффекта. В документации API указано, что дочерние элементы TableLayout не могут указывать атрибут layout_width. Ширина всегда равна MATCH_PARENT., поэтому я удалил эти строки, поскольку они игнорируются. - person Sound Conception; 15.11.2013
comment
Ты прав. Дополнительный LinearLayout не нужен. XML был упрощен для проверки этой проблемы из плавающего диалогового окна, которое добавляет другие представления во второй LinearLayout. Теперь я отредактировал код в вопросе, чтобы избавиться от него. Спасибо - person Sound Conception; 15.11.2013

вам нужно программно получить ширину базового linearlayout в java-файле...

Как получить ширину? Проверьте здесь

после этого вы можете установить ширину макета таблицы с той же шириной

  TableLayout layout = (TableLayout)findViewById(R.id.tableLayout);
    // Gets the layout params that will allow you to resize the layout

LayoutParams params = layout.getLayoutParams();

// Changes the height and width to the specified *pixels*

params.width = x;

layout.setlayoutparams(params);

x - ширина, которую вы получаете из линейного макета

person Avinash    schedule 15.11.2013

person    schedule
comment
Спасибо. Я попытался установить android:stretchColumns="1", чтобы второй столбец растянулся и заполнил пустую ширину таблицы, но это заставило таблицу заполнить ширину экрана. Ваше предложение установить вес второго представления в каждой строке равным 1 достигает того, что я думал, что stretchColumns должен был сделать, прочитав документы API. Это предполагает, что атрибут stretchColumns может быть немного сломан, да? - person Sound Conception; 15.11.2013
comment
иногда некоторые атрибуты, которые должны работать, но не работают. Я думаю, это может быть из-за какого-то родительского стиля или, что еще хуже, из-за версии. - person Ismail Sahin; 15.11.2013