2011-03-23 11 views
73

Mi estructura de diseño es como estomargen FrameLayout no trabajar

LinearLayout 
    FrameLayout 
     ImageView 
     ImageView 
    FrameLayout 
    TextView 
LinearLayout 

he puesto margen de ImageView para los dos que están dentro FrameLayout. Pero los márgenes de FrameLayout se descartan y siempre establece 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> 

Respuesta

215

que tenían el mismo problema a mí mismo y se dio cuenta que la fijación de los márgenes layout_ no funciona hasta que también configurar la presentación de la gravedad, es decir android:layout_gravity="top" de su ImageView en el archivo de recursos XML, o de código: FrameLayout.LayoutParams.gravity = Gravity.TOP;.

+19

Funciona, pero me hace sentir sucio. Pensé que había escapado los días de los hacks CSS ... – erlando

+1

funciona, preguntándose si es un error? – Johnny

+1

FrameLayout.LayoutParams.gravity no tiene una opción de gravedad en 2.3 – JPM

0

¿Has probado android: layout_gravity? Prueba usar android: relleno en tus ImageViews en lugar de android: layout_margin. Los márgenes de AFAIK no funcionan correctamente en el diseño del Marco. Incluso tuve que escribir diseño personalizado para ese fin una vez. Por cierto, ¿cómo quieres alinearte con ImageViews?

+0

no hay peso en un framelayout – njzk2

1

tomadas de los documentos FrameLayout (link)

El tamaño de la disposición de marcos es el tamaño de su hijo mayor (más relleno), visible o no (si se dispone de matrices de la FrameLayout).

Esto parece describir el hecho de que despojará los márgenes. Al igual que en el caso de Boulder, podría intentar cambiar al relleno, ya que puede usarse para producir un efecto similar si se realiza correctamente.

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

7

añadir su xml este atributo y vuelve a ejecutar

androide: layout_gravity = "top"

todo está bien!

y no establece nuevos parámetros de diseño como este;

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

uso como esto:

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

Entonces, si no tiene LayoutParams, se bloqueará con el segundo método. –

+0

puede verificarlo con if == null control. –

+0

Esto resuelve mi problema con margin_top en Android 10. –

0

setCropToPadding intento (verdadero) a ImageView, esto debería ayudar!

8

Para que quede más claro por qué. El FrameLayout.onLayout() de llamada contiene este (API v2.3.4 en al menos):

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

lo tanto, si la gravedad es -1, no habrá cálculo del margen. Y lo 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 la gravedad no está establecido, no habrá cálculo del margen.

0

tiene que establecer su gravedad de 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