можно ли равномерно распределить пуговицы по всей ширине элемента 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>
17 196

17 ответов:

расширения fedj это!--5-->, если значение layout_width до 0dp и выберите layout_weight для каждой из кнопок до 1, доступная ширина будет разделена поровну между кнопками.

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

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

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

вы можете сделать это, давая как ViewС 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_weights. таким образом, если вы дали взгляды layout_weight="2" и layout_weight="1",результирующее отношение будет 2 к 1, то есть: первый вид получит 2/3 пространства, которое осталось, а другой вид 1/3.

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

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

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

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

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

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

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

[] Button1 [] Button2 []

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

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

надеюсь, что это помогает.

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

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

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

Это может быть достигнуто назначением 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 определенный в каждой кнопке смогите распределить elemenents равномерно вдоль контейнер:

enter image description here

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

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

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

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

enter image description here

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

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

самый простой и быстрый способ, (но не лучший), чтобы добавить TextView с пустым атрибутом текста, как это

android:text=""

цвет фона должен быть одинаковым в LinearLayout, тогда вы можете использовать свойство padding, например

android:paddingBottom="250dp"

или что вам нужно. вот пример.

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

средневзвешенный детей

создать линейный макет, в котором каждый ребенок использует то же количество пробел на экране, установите android: layout_height каждого вида, чтобы "0dp" (для вертикальной компоновки) или android: layout_width каждого вида до "0dp" (для горизонтальной компоновки). Затем установите android: layout_weight каждого вида в "1".

для того чтобы это работало в LinearLayout просмотр группы значений атрибутов для android:layout_width и android:layout_height должны быть равны "match_parent"...

<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-плоскость находится внизу. Это отображается на экране.