Возможно равномерно распределять кнопки по ширине андроида linearlayout

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

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

<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>

Ответ 1

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

Ответ 2

Если вы не хотите, чтобы кнопки масштабировались, но отрегулируйте расстояние между кнопками (равное расстояние между всеми кнопками), вы можете использовать представления с весом = "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>

Ответ 3

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

<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>

Ответ 4

Вы можете сделать это, указав View a 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>

Способ работы android layout_weight заключается в следующем:

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

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

Чтобы объяснить, почему 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>

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

[] Button1 [] Button2 []

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

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

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

Ответ 8

i для этого создала пользовательский вид DistributeLayout.

Ответ 9

Это может быть достигнуто при назначении 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);
    }

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

введите описание изображения здесь

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

введите описание изображения здесь

Ответ 10

Лучший подход - использовать TableLayout с android: layout_width = "match_parent", а в столбцах используется android: layout_weight = "1" для всех столбцов

Ответ 11

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

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

Ответ 12

Вышеупомянутые ответы с использованием layout_didn't работают для меня, но следующее.

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_weight="0.1"
    android:layout_gravity="center_horizontal"
    >

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
       />

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"/>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"
        />

    <android.support.design.widget.FloatingActionButton
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center"
        android:layout_marginLeft="40dp"
        android:layout_marginStart="40dp"/>

</LinearLayout>

Вот как он выглядит на экране,

введите описание изображения здесь

Ответ 13

Прежде всего ответы правильные, но в случае, когда вам нужны видимые и удаленные функции, этот прагматический метод будет хорошо работать

<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btnOne"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>

        <Button
            android:id="@+id/btnTwo"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>


        <Button
            android:id="@+id/btnThree"
            android:layout_width="120dp"
            android:layout_height="match_parent"></Button>
    </LinearLayout>



 float width=CommonUtills.getScreenWidth(activity);
            int cardWidth=(int)CommonUtills.convertDpToPixel (((width)/3),activity);

LinearLayout.LayoutParams params =
                new LinearLayout.LayoutParams(width,
                        LinearLayout.LayoutParams.MATCH_PARENT);

btnOne.setLayoutParams(params);
btnTwo.setLayoutParams(params);
btnThree.setLayoutParams(params);

public class CommonUtills {
public static float getScreenWidth(Context context) {
        float width = (float) 360.0;
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        width = displayMetrics.widthPixels / displayMetrics.density;
        return width;
    }
}

Ответ 14

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<TextView
    android:text="Tom"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

<TextView
    android:text="Tim"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

<TextView
    android:text="Todd"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:textSize="24sp" />

Ответ 15

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:text="Tom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp" 
        android:layout_weight="3"/>

    <TextView
        android:text="Tim"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp"
        android:layout_weight="3"/>

    <TextView
        android:text="Todd"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="24sp" 
        android:layout_weight="3"/>

</LinearLayout>

В круге, Том, Тим и Тодд считаются 3 сантиметрами. Если вы хотите, чтобы это был сенсорный экран, поставьте его так, как Том и Тим считаются 1 сантиметром, что означает, что они объединяют виртуальные, но его 2D-плоскость находится внизу. Это отображается на экране.