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

 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?

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).

  • ¿Por qué tengo espacio en blanco en la parte superior y en la parte inferior de mi ImageView en mi RelativeLayout?
  • ¿Cómo agrupar RadioButton de LinearLayouts diferentes?
  • Disposición del botón de Android: consigue dos botones lado a lado en toda la pantalla
  • Cómo agregar linealmente LinearLayout con color de fondo y peso a otro diseño
  • Pasar el enfoque de padres a hijos en Linear Layout
  • Altura y peso de la disposición lineal
  • Linear Layout Android - ¿Cómo mantener el elemento en la parte inferior de la vista?
  • Agregue sólo el borde superior e inferior en LinearLayout
  • Android - LinearLayout en ScrollView en Relativelayout
  • ¿Cómo agregar un divisor (vertical) a un LinearLayout horizontal?
  • Android: dibujable junto a TextView con el peso de cada TextView en LinearLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.