2016-08-29 6 views
0

У меня есть простой GridLayout:Android GridLayout fill_horizontal выходит за пределы экрана

<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, но он делает то же самое, когда работает на устройстве).

enter image description here

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

+1

http://stackoverflow.com/questions/30845440/edittext-getting-out-of-gridlayout см. Это – KrishnaJ

ответ

0

Я не уверен, зачем вам нужен GridView для случая, возможно, вы знаете лучше меня, но вы можете найти что-то полезное для вас в этом посте Gridview with two columns and auto resized images.

В вашем случае 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), о них андроида : layout_width, а также присвоить им android: layout_columnWeight. Это установит некоторые пропорции ваших столбцов (играйте с этим значением, чтобы установить его для ваших нужд).

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

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

Спасибо за любые вопросы.

+0

Благодарим за отзыв. Пример был сокращен, чтобы сосредоточиться на проблеме, поэтому она упрощена. Решение было указано в комментарии к вопросу, который должен был установить layout_width в 0dp. – jgm

+0

Я не уверен, почему вы даете мне -1 для этого ответа, когда вы делаете то же самое для решения проблемы (установка 0dp на вашу ширину attr), но все, почему я не могу ничего с этим поделать. Мой ответ не ошибается, чтобы получить отрицательный голос – Sniper

+0

Я не выбрал ваш ответ как правильно, потому что он использует фиксированную ширину, что не обеспечило бы необходимый результат, чтобы заполнить ширину экрана, но не упасть с края. – jgm

Смежные вопросы