Resolver conflictos entre android: gravedad y android: layout_gravity
Considere el siguiente diseño trivial.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_gravity="top" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </LinearLayout> </LinearLayout>
El LinearLayout
externo especifica que tiene
- fije el ancho y la altura como porcentaje en el diseño relativo
- Android: cómo hacer que no haya espacio entre el botón 2 en un lineal horizontallayout
- Botones imágenes de fondo estiradas (wrap_content o uso de dp)
- Cómo establecer el tamaño de ViewPager
- Cómo agregar mediante programación ImageView en LinearLayout sin espacios adicionales?
android:gravity="bottom"
Lo que significa que quiere que sus hijos "caigan al fondo".
El LinearLayout
interno especifica que
android:layout_gravity="top"
Lo que significa que quiere que se establezca en la parte superior de su disposición adjunta. (Para especificar android:layout_gravity
uno debe, aparentemente, editar el archivo XML directamente.No parece ser una manera de llegar a ese atributo de Eclipse.En cualquier caso …)
¿Cómo resuelve Android este tipo de conflicto? El ejemplo anterior sugiere que el atributo de gravity
reemplaza el atributo layout_gravity
. ¿Es así como se resuelve el conflicto en general?
- LinearLayout con divisores en pre Honeycomb
- Margen ignorado por LinearLayout
- Elemento xml de la referencia de diseño de Android más adelante en el archivo
- RelativeLayout devuelve LinearLayout LayoutParams
- Método Onlayout en el diseño personalizado extendiendo LinearLayout
- TextView "fill_parent" no rellena el padre
- Establecer un margen entre dos botones de forma programática desde una imagen lineal
- Cómo colocar un LinearLayout debajo de un LinearLayout dentro de otro RelativeLayout?
Si layoutVertical()
un vistazo al método layoutVertical()
en LinearLayout
, la gravity
de LinearLayout
es lo que determina la posición de los niños .
La layout_gravity
de layout_gravity
de cada niño se utiliza sólo para tender "en la otra dirección" (es decir, izquierda-derecha).
Primero:
final int majorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK; final int minorGravity = mGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK; switch (majorGravity) { case Gravity.BOTTOM: childTop = ... break; // ... same for CENTER_VERTICAL and TOP }
Luego, para cada niño:
for (int i = 0; i < count; i++) { final View child = getVirtualChildAt(i); final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) child.getLayoutParams(); int gravity = lp.gravity; if (gravity < 0) { gravity = minorGravity; } final int layoutDirection = getLayoutDirection(); final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection); switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { case Gravity.CENTER_HORIZONTAL: childLeft = ... break; // ... same for RIGHT and LEFT
Y equivalentemente para layoutHorizontal()
.
Además, sólo un comentario, pero android:layout_gravity
se puede acceder desde el código Java. Es el campo de gravity
de la clase LinearLayout.LayoutParams
(que se establece como LayoutParams
de la vista secundaria).
- Cómo hacer que una videoview NO se inicie automáticamente después de preparado
- SQLiteStatement por qué ningún método para la instrucción SELECT – cualquier solución y por qué no hilo seguro