Можно ли равномерно распределить кнопки по ширине линейного макета Android? - PullRequest
222 голосов
/ 12 августа 2010

У меня есть линейный макет (ориентированный горизонтально), который содержит 3 кнопки.Я хочу, чтобы 3 кнопки имели фиксированную ширину и были равномерно распределены по ширине линейного макета.

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

<LinearLayout android:id="@+id/LinearLayout01" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:layout_width="fill_parent" 
android:gravity="center">

<Button 
android:id="@+id/btnOne"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>

<Button 
android:id="@+id/btnTwo"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>


<Button 
android:id="@+id/btnThree"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:width="120dip"></Button>

</LinearLayout>

Ответы [ 17 ]

312 голосов
/ 12 августа 2010

Расширение ответа fedj , если вы установите layout_width на 0dp и установите layout_weight для каждой кнопки на 1, доступная ширина будет поровну распределена между кнопками.

207 голосов
/ 02 января 2013

Если вы не хотите, чтобы кнопки масштабировались, а отрегулировали расстояние между кнопками (одинаковое расстояние между всеми кнопками), вы можете использовать представления с weight = "1", которые заполнят пространство между кнопками:

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

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@null"
        android:gravity="center_horizontal|center_vertical"
        android:src="@drawable/tars_active" />

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

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@null"
        android:gravity="center_horizontal|center_vertical"
        android:src="@drawable/videos_active" />

    <Space
        android:layout_width="0dp"
        android:layout_height="1dp"
        android:layout_weight="1" >
    </Space>
22 голосов
/ 19 сентября 2015

Вы можете использовать его следующим образом.

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="15dp">
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Save"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Reset"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="cancel"/>
    <Space
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"/>
</LinearLayout>
19 голосов
/ 12 мая 2015

Вы можете сделать это, задав View s layout_width из 0dp и layout_weight из 1:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

    <TextView
        android:layout_width="0dp"
        android:text="example text"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

</LinearLayout>

Способ работы layout_weight для Android таков:

  • Во-первых, он смотрит на размер, который обычно занимает View, и резервирует это пространство.
  • секунды, если макет равен match_parent, то он разделит оставшееся пространство на соотношение layout_weight с. Таким образом, если вы задали просмотры layout_weight="2" и layout_weight="1", результирующее соотношение будет 2 к 1, то есть: первое представление получит 2/3 оставшегося пространства, а другое представление 1 / 3.

Так вот почему, если вы дадите layout_width размер 0dp, первый шаг не будет иметь дополнительного значения, поскольку обоим представлениям не назначено никакого пространства. Тогда только вторая точка определяет пространство, которое получает каждый View, тем самым давая View s пространство, которое вы указали в соответствии с соотношением!

Чтобы объяснить, почему 0dp приводит к одинаковому разделению пространства, приведем пример, демонстрирующий обратное: Приведенный ниже код приведет к чему-то другому, поскольку example text теперь имеет ширину, превышающую 0dp потому что он имеет wrap_content, вместо этого оставляя свободное пространство для деления менее 100%, потому что текст занимает место. В результате у них останется 50% свободного места, но текст уже занял некоторое пространство, поэтому TextView будет иметь значительно больше 50% от общего пространства.

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

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

</LinearLayout>
13 голосов
/ 15 ноября 2011

Что ж, если у вас ровно 3 кнопки и если все в порядке (или даже запланировано), что внешние кнопки выровнены по левому и правому краю, то вы можете попробовать RelativeLayout, который требует меньше накладных расходов (во многих ситуациях).

Вы можете использовать layout_alignParentBottom, чтобы выровнять все кнопки в нижней части макета.Используйте layout_alignParentLeft and Right для внешних кнопок и layout_centerHorizontal для средней кнопки.

Это будет хорошо работать при различных ориентациях и размерах экрана.

11 голосов
/ 12 августа 2010

Вы должны взглянуть на Android: атрибут layout_weight

4 голосов
/ 29 ноября 2016

Этого можно достичь, назначив weight каждой кнопке, добавленной в контейнер, очень важно определить горизонтальную ориентацию:

    int buttons = 5;

    RadioGroup rgp = (RadioGroup) findViewById(R.id.radio_group);

    rgp.setOrientation(LinearLayout.HORIZONTAL);

    for (int i = 1; i <= buttons; i++) {
        RadioButton rbn = new RadioButton(this);         
        rbn.setId(1 + 1000);
        rbn.setText("RadioButton" + i);
        //Adding weight
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);
        rbn.setLayoutParams(params);
        rgp.addView(rbn);
    }

, чтобы мы моглив результате получим это в нашем устройстве:

enter image description here

, даже если мы повернем наше устройство на weight, определенное в каждой кнопке, может равномерно распределять элементы вдоль контейнера:

enter image description here

4 голосов
/ 27 ноября 2015

Я предлагаю вам использовать атрибут weightSum LinearLayout.

Добавление тега android:weightSum="3" в объявление xml вашего LinearLayout и затем android:layout_weight="1" к вашим кнопкам приведет к равномерному распределению 3 кнопок.

4 голосов
/ 31 мая 2012

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

[] Button1 [] Button2 []

([] представляет объект LinearLayout, используемый для разнесения)

затем я установил вес каждого из этих [] объектов LinearLayout на 1, и я получил кнопки с равномерным распределением.

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

4 голосов
/ 11 июля 2014

Я создал собственный вид DistributeLayout , чтобы сделать это.

...