Android GridLayout fill_horizontal выходит за пределы экрана

У меня простой GridLayout:

<GridLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:columnCount="2"
    android:rowCount="1" >

    <TextView
        android:layout_column="0"
        android:layout_row="0"
        android:text="Label"/>

    <EditText
        android:inputType="text"
        android:layout_column="1"
        android:layout_row="0"
        android:text="asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf asdf"
        android:layout_gravity="fill_horizontal"/>
</GridLayout>

Однако это вызывает EditText чтобы выйти за пределы экрана, как можно увидеть ниже (изображение из IDE, но оно делает то же самое при работе на устройстве).

Похоже, что EditText на самом деле полная ширина экрана, а не ширина GridLayout клетка, поэтому она выходит за пределы экрана. Что пошло не так в макете, чтобы вызвать это?

1 ответ

Я не уверен, зачем вам нужен GridView для этого случая, может быть, вы знаете лучше, чем я, но вы можете найти что-то полезное для вас в этом посте Gridview с двумя столбцами и изображениями с автоматическим изменением размера.

В вашем случае GridView имеет 2 столбца, и внутри каждого из них у вас есть представления, которые не установили никаких значений для параметров ширины и высоты, и в этом случае Android исключает их для wrap_content.

Когда TextView и EditText имеют layout_width="wrap_content", они будут расширять себя на одну строку, пока не обернут весь контент. Вот почему вы выходите за пределы экрана телефона.

Попробуйте этот xml, и вы увидите ожидаемое поведение:

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:columnCount="2"
android:rowCount="1">
<TextView
    android:layout_width="20dp"
    android:layout_height="wrap_content"
    android:layout_columnWeight="0.5"
    android:layout_column="0"
    android:text="Label with some long text event more text"/>
<EditText
    android:layout_width="50dp"
    android:layout_height="wrap_content"
    android:layout_columnWeight="1.5"
    android:inputType="textMultiLine"
    android:layout_column="1"
    android:text="Some really long text here and more and more and more ....  "
    android:layout_gravity="fill_horizontal"/>

Здесь мы просто устанавливаем некоторые жестко закодированные значения для ваших детей (TextView и EditText), об их атрибутах android:layout_width и присваиваем им атрибут android:layout_columnWeight. Это установит некоторые пропорции ваших столбцов (играйте с этим значением только для того, чтобы установить его для своих нужд).

С EditText мы также делаем что-то маленькое (android:inputType="textMultiLine"), чтобы убедиться, что ваш текст будет перенесен на несколько строк.

Кстати: если вы делаете какие-то формы ввода, я предлагаю вам использовать для этого другие ViewGroups, например LinearLayout.

Спасибо любые вопросы, пожалуйста, комментарии.

Другие вопросы по тегам