2012-11-14 3 views
8

Добавление Spinner в GridLayout, похоже, «сломает» макет. Я привел минимальный рабочий пример, чтобы проиллюстрировать проблему:Spinner внутри GridLayout

Я хочу сетку с метками слева и элементами управления справа. Элементы управления справа должны занимать оставшееся пространство. Это то, что простой пример выглядит следующим образом:

Grid with EditTexts

Замена одного из элементов управления ввода с вертушкой вызывает правый столбец выдвинется из границ экрана, что приводит к уродливому макету.

Grid with Spinner

Почему это происходит, и как я могу избежать этого?


Вот код первого примера:

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

    <TextView 
     android:layout_gravity="left" 
     android:text="TextView" /> 

    <EditText 
     android:layout_gravity="fill_horizontal" 
     android:hint="EditText" /> 

    <TextView 
     android:layout_gravity="left" 
     android:text="TextView" /> 

    <EditText 
     android:layout_gravity="fill_horizontal" 
     android:hint="EditText" /> 

</GridLayout> 

А вот код для второго изображения. Единственное отличие состоит в том, что первый EditText был заменен Spinner:

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

    <TextView 
     android:layout_gravity="left" 
     android:text="TextView" /> 

    <Spinner 
     android:id="@+id/spinner1" 
     android:layout_gravity="fill_horizontal" /> 

    <TextView 
     android:layout_gravity="left" 
     android:text="TextView" /> 

    <EditText 
     android:layout_gravity="fill_horizontal" 
     android:hint="EditText" /> 

</GridLayout> 

ответ

16

Судя по всему, проблема может быть решена путем установки layout_width от Spinner к нулю:

<Spinner 
    android:id="@+id/Spinner1" 
    android:layout_gravity="fill_horizontal" 
    android:layout_width="0dp" /> 

I Отметьте это как принятый ответ, так как он легко устранит проблему, но я с радостью изменим это, если кто-то может найти объяснение для этого поведения.

+0

Я бы сказал, что поведение, которое вы видите из-за атрибута 'layout_gravity', установленного на' FILL_HORIZONTAL', который растягивает (даже за пределами видимого экрана) представления, чтобы они имели такую ​​же ширину, что и их родительский (из документов для ' Поле FILL_HORIZONTAL': * При необходимости увеличивайте горизонтальный размер объекта, чтобы он полностью заполнял его контейнер. *). – Luksprog

+0

@Luksprog: Установки гравитации имеют другое значение внутри GridLayout (см. Http://developer.android.com/reference/android/widget/GridLayout.html, раздел «Распределение избыточного пространства»). Например, установка 'layout_gravity' счетчика на' left' дает ту же проблему. – Heinzi

+0

Возможно, я не слишком много играл с «GridLayout». Я только что вспомнил, что я читал из класса Gravity. – Luksprog

1
try this code 

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

    <TableRow 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="TextView" /> 

     <Spinner 
      android:id="@+id/spinner1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:layout_weight="1" /> 
    </TableRow> 

    <TableRow 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" > 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="TextView" /> 

     <EditText 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_horizontal" 
      android:layout_weight="1" 
      android:hint="EditText" /> 
    </TableRow> 

</TableLayout> 
+0

+1. Спасибо, это полезное решение. – Heinzi

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