Pregunta El margen de FrameLayout no funciona


Mi estructura de diseño es así

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

He establecido márgenes para los dos ImageView que están dentro de 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>

73
2018-03-23 07:14


origen


Respuestas:


Tuve el mismo problema y me di cuenta de que configurar el layout_ los márgenes no funcionan hasta que también configure 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;.


217
2018-05-25 10:58



Para que quede 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

Entonces, si la gravedad es -1, no habrá cálculo de margen. Y el asunto es que la gravedad en FrameLayout.LayoutParams está definida por:

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

Entonces, si la gravedad no está establecida, no habrá cálculo de margen.


8
2017-09-23 15:06



agrega tu xml a este atributo y vuelve a ejecutar

android: 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);

usar de esta manera:

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

7
2017-10-01 19:03



Tomado de los documentos de FrameLayout (enlazar)

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

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, mencionaste que funciona bien cuando se usa un LinearLayout contenedor, ¿por qué elegir FrameLayout?


1
2018-04-13 23:53



¿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
2018-03-23 08:49



prueba setCropToPadding (true) a ImageView, ¡esto debería ser ayudado!


0
2018-06-01 14:58



tiene que establecer la gravedad del diseño de su ImageView, es decir, android: layout_gravity = "top" en el archivo de recursos XML, o desde el código: FrameLayout.LayoutParams.gravity = Gravity.TOP


0
2018-06-20 07:49