Почему кнопки растягиваются, чтобы покрыть весь выделенный layout_weight - PullRequest
7 голосов
/ 19 марта 2012

Я пытаюсь выровнять 3 кнопки (слева, по центру, справа). Я знаю, что это, вероятно, можно сделать с помощью гравитации, но я попытался понять концепцию layout_weight здесь. Я использую этот код:

<LinearLayout
id=..
layout_width =  "wrap_content"
layout_height = "wrap_content"
orientation="Horizonta"
>
 <Button
  id=1
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  layout_weight = "1"
  text= "text" />

 <Button
  id=2
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  layout_weight = "1"
  text= "text" />

 <Button
  id=3
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  layout_weight = "1"
  text= "text" />
</LinearLayout>

Тем не менее, я получаю верхнюю часть изображения ниже. Что правильно. Вопрос в том, почему кнопка растягивается, чтобы покрыть всю область, которую она выделяет, когда я использую wrap_content?

enter image description here

Спасибо

Ответы [ 3 ]

6 голосов
/ 20 марта 2012

layout_weight используется для указания того, как дополнительное свободное место на экране должно быть разделено между виджетами. В этом случае у нас есть три кнопки с одинаковым layout_weight и, следовательно, кнопки будут увеличиваться одинаково до тех пор, пока не освободится все свободное пространство.

Нужно попробовать что-то еще, чтобы получить кнопки оригинального размера и выравнивание того, что мы хотим (слева - по центру - справа). Одна проблема заключается в том, что горизонтальный LinearLayout не является полностью совместным, когда речь идет о соблюдении параметров layout_gravity. Мы сможем использовать параметры layout_gravity, которые влияют на выравнивание по вертикали, но горизонтальные игнорируются родительским LinearLayout, вздыхая в другом тупике.

Решение состоит в том, чтобы поместить что-то между кнопками, чтобы они помещались в нужное место на экране. Пространственный вид был введен в API 14 (Ice Cream Sandwich) и подходит для этого.

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

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

     <Space
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight = "1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <Space
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight = "1" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

Представления Space также могут быть заменены парой пустых TextView, чтобы дизайн работал на устройствах с более ранними уровнями API.

<TextView
    android:id="@+id/textView1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1.0"
    android:text="" />     
2 голосов
/ 19 марта 2012

Когда используется вес, layout_width опускается, и используется только алгоритм веса, а затем растягивается элемент.

1 голос
/ 19 марта 2012

Ваши кнопки заполняют пространство, потому что вы используете layout_weight="1", который указывает кнопкам занять дополнительное доступное пространство, а также потому, что атрибут layout_weight равен 1 для всех кнопок, они будут занимать одинаковое пространство и иметь одинаковый размер.Вы не можете получить этот нижний макет, используя layout_weight, используйте layout_gravity, чтобы расположить их (вот еще один вопрос об этом Что означает android: layout_weight? ).

Если вы хотите изображение ниже, попробуйте это:

<LinearLayout
id=..
layout_width =  "wrap_content"
layout_height = "wrap_content"
orientation="Horizonta"
>
 <Button
  id=1
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  android:layout_gravity="left"
  text= "text" />

 <Button
  id=2
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  android:layout_gravity="center_horizontal"
  text= "text" />

 <Button
  id=3
  layout_width =  "wrap_content"
  layout_height = "wrap_content"
  android:layout_gravity="right"
  text= "text" />
</LinearLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...