можно ли равномерно распределить пуговицы по всей ширине элемента 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_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для средней кнопки.что будет хорошо работать на различных ориентаций и размеров экрана.
для равномерного размещения двух кнопок в горизонтальной линейной компоновке я использовал 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-плоскость находится внизу. Это отображается на экране.


