android - linearlayout - relative layout
¿Es posible distribuir los botones de manera uniforme en todo el ancho de un lineallayout de Android? (17)
Tengo un diseño lineal (orientado horizontalmente) que contiene 3 botones. Quiero que los 3 botones tengan un ancho fijo y que se distribuyan uniformemente en todo el ancho del diseño lineal.
Puedo manejar esto configurando la gravedad de linearlayout en el centro y luego ajustando el relleno de los botones, pero esto funciona para un ancho fijo y no funciona para cambiar dispositivos u orientaciones.
<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>
Ampliando la respuesta de fedj , si establece layout_width
en 0dp
y configura el layout_weight
para cada uno de los botones en 1, el ancho disponible se compartirá de manera equitativa entre los botones.
Bueno, si tiene exactamente 3 botones y está bien (o incluso planeado) que los botones externos estén alineados al lado izquierdo y derecho, entonces es posible que desee probar un RelativeLayout que es menos general (en muchas situaciones).
Puede usar layout_alignParentBottom
para alinear todos los botones con la parte inferior del diseño. Use layout_alignParentLeft and Right
para los botones externos y layout_centerHorizontal
para el botón central.
Eso funcionará bien en diferentes orientaciones y tamaños de pantalla.
Debes echarle un vistazo al atributo android: layout_weight
El mejor enfoque es usar TableLayout con android: layout_width = "match_parent" y en las columnas use android: layout_weight = "1" para todas las columnas
Esto se puede lograr asignando weight
a cada botón agregado dentro del contenedor, muy importante para definir la orientación horizontal:
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);
}
para que podamos obtener esto en nuestro dispositivo como resultado:
Incluso si giramos nuestro dispositivo, el weight
definido en cada botón puede distribuir los elementos uniformemente a lo largo del contenedor:
He creado una vista personalizada de DistributeLayout para hacer esto.
La forma más fácil y rápida, (pero no la mejor), es agregar un TextView con un atributo de texto vacío, como este
android:text=""
el color de fondo debe ser el mismo en LinearLayout, entonces usted podría usar la propiedad de relleno, como esta
android:paddingBottom="250dp"
o lo que necesites. Aquí hay un ejemplo.
Las respuestas anteriores usando layout_did no funcionaron para mí, pero lo siguiente lo hizo.
<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>
Así es como se ve en la pantalla,
Le sugiero que use el atributo weightSum de LinearLayout.
Agregar la etiqueta android:weightSum="3"
a la declaración xml de su LinearLayout y luego android:layout_weight="1"
a sus botones dará como resultado que los 3 botones se distribuyan de manera uniforme.
Para espaciar uniformemente dos botones en un diseño lineal horizontal, utilicé 3 objetos LinearLayout para que actúen como espacios que se redimensionarán automáticamente. Coloqué estos objetos LinearLayout como sigue:
[] Button1 [] Button2 []
([] representa un objeto LinearLayout usado para el espaciado)
luego puse cada uno de los pesos de estos [] objetos LinearLayout en 1, y obtengo botones espaciados uniformemente.
Espero que esto ayude.
Por encima de todas las respuestas son correctas, pero en el caso de que necesite funciones visibles y desaparecidas, este método pragmático funcionará bien.
<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;
}
}
Puede hacer esto dando tanto un layout_width
de 0dp
de View
layout_width
de 0dp
como un layout_weight
de layout_weight
de 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>
La forma en que android layout_weight funciona es que:
- Primero, mira el tamaño que normalmente tomaría una Vista y reserva este espacio.
- segundo, si el diseño es
match_parent
entonces se dividirá el espacio que queda en la relación dellayout_weight
s. Por lo tanto, si dio las Vistaslayout_weight="2"
ylayout_weight="1"
, la relación resultante será de 2 a 1, es decir: la primera Vista obtendrá 2/3 del espacio que queda y la otra vista 1 / 3.
Por eso, si layout_width
a layout_width
un tamaño de 0dp
el primer paso no tiene un significado adicional, ya que a ambas Vistas no se les asigna ningún espacio. Entonces, solo el segundo punto decide el espacio que obtiene cada View
, por lo tanto, ¡le da a la View
el espacio que especificó de acuerdo con la proporción!
Para explicar por qué 0dp
hace que el espacio se divida de manera equitativa al proporcionar un ejemplo que muestra lo contrario: el siguiente código resultaría en algo diferente, ya que el example text
ahora tiene un ancho mayor que 0dp
porque tiene wrap_content
lugar de dejar el espacio libre a Divide menos del 100% porque el texto ocupa espacio. El resultado será que obtienen el 50% del espacio libre que queda, pero el texto ya ocupa algo de espacio, por lo que TextView
tendrá más del 50% del espacio total.
<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>
Puedes usarlo con lo siguiente.
<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>
Si no desea que los botones se escalen, pero ajusta el espacio entre los botones (espacio igual entre todos los botones), puede usar vistas con peso = "1" que llenarán el espacio entre los botones:
<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>
Para crear un diseño lineal en el que cada niño use la misma cantidad de espacio en la pantalla, configure el android: layout_height de cada vista en "0dp" (para un diseño vertical) o el android: layout_width de cada vista en "0dp" ( para un diseño horizontal). A continuación, establezca el android: layout_weight de cada vista en "1".
Para que esto funcione en el grupo de vistas LinearLayout
, los valores de atributo para android:layout_width
y android:layout_height
deben ser iguales a "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>
En círculo, se supone que Tom, Tim y Todd miden 3 centímetros. Si desea que sea una pantalla táctil, póngala como Tom y Tim se supone que son 1 centímetro, lo que significa que combinan lo virtual, pero su plano 2D está en la parte inferior. Esto se muestra en la pantalla.
<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" />