Meine Layoutstruktur ist so
LinearLayout
FrameLayout
ImageView
ImageView
FrameLayout
TextView
LinearLayout
Ich habe Ränder für die beiden ImageView festgelegt, die sich in FrameLayout befinden. Die FrameLayout-Ränder werden jedoch verworfen und das Bild wird immer auf die obere linke Ecke gesetzt. Wenn ich von FrameLayout zu LinearLayout wechsle, funktioniert der Rand ordnungsgemäß. Wie gehe ich damit um?
<?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
quelle
quelle
// for each child: final LayoutParams lp = (LayoutParams) child.getLayoutParams(); final int gravity = lp.gravity; if (gravity != -1) { // handle all margin related stuff
Wenn also die Schwerkraft -1 ist, erfolgt keine Margenberechnung. Die Schwerkraft in FrameLayout.LayoutParams wird definiert durch:gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1);
Wenn die Schwerkraft nicht eingestellt ist, erfolgt keine Margenberechnung.Um klarer zu machen warum. Der Aufruf von FrameLayout.onLayout () enthält Folgendes (mindestens in API v2.3.4):
// for each child final LayoutParams lp = (LayoutParams) child.getLayoutParams(); final int gravity = lp.gravity; if (gravity != -1) { // handle all margin related stuff
Wenn also die Schwerkraft -1 ist, erfolgt keine Margenberechnung. Und die Sache ist, die Schwerkraft in FrameLayout.LayoutParams wird definiert durch:
gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1);
Wenn also die Schwerkraft nicht eingestellt ist, erfolgt keine Margenberechnung.
quelle
Fügen Sie Ihrem XML dieses Attribut hinzu und führen Sie es erneut aus
android: layout_gravity = "top"
alles ist ok!
und Sie legen keine neuen Layoutparameter wie diese fest;
FrameLayout.LayoutParams llp = new FrameLayout.LayoutParams(WallpapersActivity.ScreenWidth/2, layH);
Verwendung wie folgt:
FrameLayout.LayoutParams llp = (LayoutParams) myFrameLay.getLayoutParams(); llp.height = 100; llp.width = 100; myFrameLay.setLayoutParams(llp);
quelle
Entnommen aus den FrameLayout-Dokumenten ( Link )
Dies scheint die Tatsache zu beschreiben, dass die Ränder entfernt werden. Wie bereits erwähnt, können Sie versuchen, auf Polsterung umzuschalten, da dies bei richtiger Ausführung zu einem ähnlichen Effekt führen kann.
Aus Neugier haben Sie erwähnt, dass es bei Verwendung eines
LinearLayout
Containers gut funktioniert. Warum sollten Sie sich für FrameLayout entscheiden?quelle
Haben Sie Android ausprobiert: layout_gravity? Versuchen Sie es mit android: padding in Ihren ImageViews anstelle von android: layout_margin. AFAIK-Ränder funktionieren im Rahmenlayout nicht richtig. Ich musste sogar einmal ein benutzerdefiniertes Layout für diesen Zweck schreiben. Übrigens, wie möchten Sie Ihre ImageViews zuordnen?
quelle
Versuchen Sie setCropToPadding (true) auf ImageView, dies sollte geholfen werden!
quelle
Sie müssen das Layout der Schwerkraft Ihres ImageView oben festlegen, dh android: layout_gravity = "top" in der XML-Ressourcendatei oder aus dem Code: FrameLayout.LayoutParams.gravity = Gravity.TOP
quelle