можно ли равномерно распределить пуговицы по всей ширине элемента 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 ответов:
расширения 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_weight
s. таким образом, если вы дали взгляды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>
Ну, если у вас есть ровно 3 кнопки, и если это нормально (или даже планируется), что внешние кнопки выровнены по левой и правой стороне, то вы можете попробовать RelativeLayout, который меньше накладных расходов (во многих ситуациях).
можно использовать
layout_alignParentBottom
выровнять все кнопки с нижней части макета. Используйтеlayout_alignParentLeft and Right
для внешних кнопок иlayout_centerHorizontal
для средней кнопки.что будет хорошо работать на различных ориентаций и размеров экрана.
для равномерного размещения двух кнопок в горизонтальной линейной компоновке я использовал 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); }
таким образом, мы можем получить это в нашем устройстве в результате:
даже если мы вращаем наше устройство
weight
определенный в каждой кнопке смогите распределить elemenents равномерно вдоль контейнер:
лучший подход-использовать 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>
вот как это выглядит на экране,
прежде всего ответы правы, но в случае, если вам нужны видимые и исчезнувшие функции, то этот прагматический метод будет работать хорошо
<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-плоскость находится внизу. Это отображается на экране.