FrameLayout margen no funciona

Mi estructura de diseño es así

LinearLayout FrameLayout ImageView ImageView FrameLayout TextView LinearLayout 

He fijado el margen para los dos ImageView que están dentro de FrameLayout. Pero los márgenes de FrameLayout se descartan y siempre se fija la imagen en la esquina superior izquierda. Si cambio de FrameLayout a LinearLayout el margen funciona correctamente. ¿Cómo manejar esto?

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/inner1" > <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <ImageView android:layout_width="24px" android:layout_height="24px" android:id="@+id/favicon" android:layout_marginLeft="50px" android:layout_marginTop="50px" android:layout_marginBottom="40px" android:layout_marginRight="70px" /> <ImageView android:layout_width="52px" android:layout_height="52px" android:id="@+id/applefavicon" android:layout_marginLeft="100px" android:layout_marginTop="100px" android:layout_marginBottom="100px" android:layout_marginRight="100px" /> </FrameLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/title" android:layout_marginLeft="10px" android:layout_marginTop="20px" android:textColor="#FFFFFF" android:textSize = "15px" android:singleLine = "true" /> </LinearLayout> 

Tuve el mismo problema y me di cuenta de que la configuración de los márgenes layout_ no funciona hasta que también establece la gravedad del diseño de ImageView, es decir, android:layout_gravity="top" en el archivo de recursos XML, o desde el código: FrameLayout.LayoutParams.gravity = Gravity.TOP; .

Para hacer más claro por qué. La llamada FrameLayout.onLayout () contiene esto (en api v2.3.4 al menos):

  // for each child final LayoutParams lp = (LayoutParams) child.getLayoutParams(); final int gravity = lp.gravity; if (gravity != -1) { // handle all margin related stuff 

Así que si la gravedad es -1, no habrá cálculo de margen. Y la cosa es, la gravedad en FrameLayout.LayoutParams se define por:

  gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1); 

Así que si no se establece la gravedad, no habrá cálculo de margen.

Agrega tu xml a este atributo y vuelve a correr

Android: layout_gravity = "top"

¡todo está bien!

Y usted no establece nuevos params de la disposición como esto;

 FrameLayout.LayoutParams llp = new FrameLayout.LayoutParams(WallpapersActivity.ScreenWidth/2, layH); 

Utilizar de esta manera:

 FrameLayout.LayoutParams llp = (LayoutParams) myFrameLay.getLayoutParams(); llp.height = 100; llp.width = 100; myFrameLay.setLayoutParams(llp); 

Tomado de los documentos de FrameLayout ( enlace )

El tamaño del diseño del marco es el tamaño de su hijo más grande (más el relleno), visible o no (si el padre de FrameLayout lo permite).

Esto parece describir el hecho de que quitará los márgenes. Como boulder mencionado, usted podría tratar de cambiar a relleno, ya que se puede utilizar para producir un efecto similar si se hace correctamente.

Por curiosidad, usted mencionó que funciona bien cuando se utiliza un contenedor LinearLayout , ¿por qué elegir FrameLayout?

¿Has probado android: layout_gravity? Trate de usar android: relleno en usted ImageViews en lugar de android: layout_margin. Los márgenes AFAIK no funcionan correctamente en el diseño del marco. Incluso tuve que escribir diseño personalizado para ese propósito una vez. BTW, ¿cómo quieres allign que ImageViews?

Intente setCropToPadding (true) a ImageView, esto debe ser ayudado!

Usted tiene que fijar la gravedad de la disposición de ImageView, es decir, android: layout_gravity = "top" en el archivo de recursos XML, o desde el código: FrameLayout.LayoutParams.gravity = Gravity.TOP

  • Cómo probar los valores de TextInputLayout (sugerencia, error, etc.) usando Android Espresso?
  • ¿Cómo hacer un efecto de rizo sobre un diseño lineal, sin sobrepasar el color de fondo de sus hijos?
  • Proyecto de limpieza no corrigiendo errores de R.java (Android)
  • ¿Por qué view.onLayout () se llama repetitivamente cuando se cambia = false?
  • ¿Cómo obtenerContentHeight cuando se utiliza loadData?
  • ¿Por qué utilizar un CardView en lugar de un RelativeLayout o LinearLayout?
  • Cambio de fondo de una sola fila de gridview en android
  • Colocar la vista dentro de FrameLayout en Android
  • XML Atributo para especificar pivotXType y pivotYType en ScaleAnimation
  • Gesto MultiSelect como la aplicación Google Fotos
  • Vista de componentes personalizada de Android con esquinas redondeadas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.