Ответ 1
Развернувшись на fedj answer, если вы установите layout_width
на 0dp
и установите для layout_weight
для каждой из кнопок значение 1, доступная ширина будет разделяться между кнопками.
У меня есть линейная компоновка (ориентированная по горизонтали), содержащая 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>
Развернувшись на fedj answer, если вы установите 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
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>
Хорошо, если у вас ровно 3 кнопки, и если это нормально (или даже запланировано), что внешние кнопки выровнены влево и вправо, вы можете попробовать RelativeLayout, который меньше накладных расходов (во многих ситуациях).
Вы можете использовать layout_alignParentBottom
для выравнивания всех кнопок в нижней части макета. Используйте layout_alignParentLeft and Right
для внешних кнопок и layout_centerHorizontal
для средней кнопки.
Это будет хорошо работать на разных ориентациях и размерах экрана.
Вы должны взглянуть на атрибут android: layout_weight
Для равномерного распределения двух кнопок в горизонтальной линейной компоновке я использовал 3 объекта LinearLayout, чтобы действовать как пробелы, которые будут автоматически изменяться. Я позиционировал эти объекты LinearLayout следующим образом:
[] Button1 [] Button2 []
([] представляет объект LinearLayout, используемый для интервала)
тогда я устанавливаю каждый из этих весов объектов [] LinearLayout в 1, и я получаю кнопки с равномерным интервалом.
Надеюсь, что это поможет.
i для этого создала пользовательский вид DistributeLayout.
Это может быть достигнуто при назначении 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
, определенный в каждой кнопке, может равномерно распределять элементы контейнер:
Лучший подход - использовать TableLayout с android: layout_width = "match_parent", а в столбцах используется android: layout_weight = "1" для всех столбцов
Я предлагаю использовать атрибут LinearLayout weightSum.
Добавление тега
android:weightSum="3"
к вашему объявлению xml LinearLayout, а затем android:layout_weight="1"
к вашим кнопкам приведет к равномерному распределению 3 кнопок.
Вышеупомянутые ответы с использованием 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>
Вот как он выглядит на экране,
Прежде всего ответы правильные, но в случае, когда вам нужны видимые и удаленные функции, этот прагматический метод будет хорошо работать
<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;
}
}
<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" />
<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-плоскость находится внизу. Это отображается на экране.