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>
android
android-layout
Vinoth
fuente
fuente
// 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. La gravedad en FrameLayout.LayoutParams se define mediante:gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1);
Entonces, si no se establece la gravedad, no habrá cálculo de margen.Para dejar 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 la cuestión es que la gravedad en FrameLayout.LayoutParams se define por:
gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1);
Entonces, si no se establece la gravedad, no habrá cálculo de margen.
fuente
agregue su xml este atributo y vuelva 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 así:
FrameLayout.LayoutParams llp = (LayoutParams) myFrameLay.getLayoutParams(); llp.height = 100; llp.width = 100; myFrameLay.setLayoutParams(llp);
fuente
Tomado de los documentos de FrameLayout ( enlace )
Esto parece describir el hecho de que eliminará los márgenes. Como se mencionó en Boulder, puede intentar cambiar a relleno, ya que puede usarse para producir un efecto similar si se hace correctamente.
Por curiosidad, mencionaste que funciona bien cuando se usa un
LinearLayout
contenedor, ¿por qué elegir FrameLayout?fuente
¿Has probado android: layout_gravity? Intente usar android: padding en sus ImageViews en lugar de android: layout_margin. Los márgenes AFAIK no funcionan correctamente en el diseño de cuadros. Incluso tuve que escribir un diseño personalizado para ese propósito una vez. Por cierto, ¿cómo quieres asignar tus ImageViews?
fuente
intente setCropToPadding (true) en ImageView, ¡esto debería ser ayudado!
fuente
tienes que configurar la parte superior de 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
fuente