Столбец GridLayout выходит за его пределы

Я пытаюсь создать форму в виде сетки, похожую на пример в официальном блоге разработчиков Android.

Вот мой макет:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="48dp"
        android:layout_marginRight="48dp"
        android:layout_marginTop="@dimen/activity_vertical_margin"
        android:columnCount="2"
        android:rowCount="2">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_column="0"
            android:layout_gravity="end"
            android:layout_row="0"
            android:text="Send"
            android:textColor="?android:attr/textColorPrimary"
            android:textSize="24sp" />

        <Spinner
            android:id="@+id/send_currency"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_column="1"
            android:layout_row="0" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_column="0"
            android:layout_gravity="end"
            android:layout_row="1"
            android:text="to"
            android:textColor="?android:attr/textColorPrimary"
            android:textSize="24sp" />

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_column="1"
            android:layout_row="1"
            android:hint="username"
            android:textColor="?android:attr/textColorPrimary"
            android:textSize="24sp" />
    </GridLayout>
</LinearLayout>

Мой левый столбец (статический текст, выровненный по правому краю) работает нормально. Он выравнивает текст по правому краю, а ширина зависит от самой широкой строки.

Однако правый столбец, похоже, выходит за пределы GridLayout.

Предварительный просмотр макета с выбранным GridLayout

На этом рисунке синяя рамка — это границы GridLayout. Вы уже можете увидеть проблему в зеленой полосе вверху. Предполагается, что правая сторона останавливается на границах GridLayout (как и левая сторона), но по какой-то причине она проходит мимо него.

Предварительный просмотр макета с выбранным правым столбцом

Синее поле на этом изображении — это границы EditText (для него установлено значение wrap_content). Тем не менее, рамка цвета морской волны — это границы, в которых ему разрешено расширяться. Когда я набираю много символов в EditText, он выходит за границы GridLayout и даже за край экрана телефона!

Скриншот

Это ошибка в GridLayout? Или я что-то упускаю?


person Steven Schoen    schedule 24.03.2015    source источник
comment
Вы уже нашли решение?   -  person marienke    schedule 18.05.2017


Ответы (4)


Это нормальное поведение GridLayout.

К счастью, есть новая версия GridLayout, которая была добавлена ​​с API 21. Благодаря этому факту вы можете сделать так, чтобы GridLayout размещал дочерние элементы по ширине или высоте в зависимости от их ориентации.

Подробности см. в документации< /strong>, особенно в разделе Обзор классов -> Распределение избыточного пространства. Вы можете найти там информацию о том, как использовать GridLayout так, как вы хотите.


Совет:

Не забывайте, что для использования нового GridLayout вам необходимо добавьте его как библиотеку поддержки и в xmls вы должны использовать:

<android.support.v7.widget.GridLayout ... >

вместо

<GridLayout ... > 
person paulina_glab    schedule 24.03.2015
comment
добавление поддержки gridlayout не приносит решения. есть ли определенные атрибуты, которые мы должны установить? - person Edijae Crusar; 14.06.2016

Я нашел этот ответ полезным. Кроме того, ответ paulina_glab об использовании <android.support.v7.widget.GridLayout вместо <GridLayout - спасибо!

В частности, эти атрибуты для каждой ячейки:

android:layout_width="0dp"
app:layout_columnSpan="1"
app:layout_columnWeight="1"
app:layout_rowSpan="1"

Надеюсь, поможет.

person marienke    schedule 18.05.2017

Вы можете ограничить edittext одной строкой.

<EditText 
...
android:singleLine="true"
android:lines="1"
android:maxLines="1"
android:hint="to"></EditText>
person RBK    schedule 24.03.2015
comment
Он по-прежнему чрезмерно расширяет границы вправо, так что это не решает проблему. - person Steven Schoen; 24.03.2015

Определенно странно. Что произойдет, если вы ограничите ширину EditText значением «match_parent» вместо «wrap_content» (что должно ограничивать его ширину по горизонтали в пределах ячейки сетки)?

i.e.

        <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_column="1"
        android:layout_row="1"
        android:hint="username"
        android:textColor="?android:attr/textColorPrimary"
        android:textSize="24sp" />

или, в качестве альтернативы, дать вашему EditText правое поле, чтобы попытаться немного сдвинуть эту правую границу? например

android:layout_marginRight="20dp"

и посмотреть, есть ли разница?

person wislon    schedule 24.03.2015
comment
Изменение его на match_parent по-прежнему имеет ту же проблему с переполнением, с той лишь разницей, что оно начинается шире экрана. - person Steven Schoen; 24.03.2015
comment
Маржа исправляет это, но это хакерство, и его нужно будет проверять для каждого перевода строк в первом столбце. Определенно не очень хорошее решение. - person Steven Schoen; 24.03.2015