FrameLayout-Rand funktioniert nicht

79

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>
Vinoth
quelle

Antworten:

221

Ich hatte selbst das gleiche Problem und stellte fest, dass das Festlegen der layout_Ränder erst funktioniert, wenn Sie auch die Layout-Schwerkraft Ihres ImageView festlegen, dh android:layout_gravity="top"in der XML-Ressourcendatei oder anhand von Code : FrameLayout.LayoutParams.gravity = Gravity.TOP;.

Andrei
quelle
21
Es funktioniert, aber ich fühle mich schmutzig. Ich dachte, ich wäre den Tagen der CSS-Hacks entkommen ...
erlando
1
FrameLayout.LayoutParams.gravity hat keine Schwerkraftoption in 2.3
JPM
2
Es scheint auf 4.1 behoben zu sein (wahrscheinlich vorher). Nützlich zu wissen
Pablisco
Es wurde ein Problem behoben, das ich auf dem alten Feuer hatte. Vielen Dank!
DallinDyer
12
Um klarer zu machen warum. Der Aufruf von FrameLayout.onLayout () enthält Folgendes (zumindest 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. 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.
Miklos Jakab
8

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.

Miklos Jakab
quelle
7

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);
Savas Adar
quelle
1
Wenn Sie also keine LayoutParams haben, stürzt es mit der zweiten Methode ab.
Léon Pelletier
Sie können dies mit if == null control überprüfen.
Savas Adar
Dies löst mein Problem mit margin_top auf Android 10.
Pedro Paulo Amorim
1

Entnommen aus den FrameLayout-Dokumenten ( Link )

Die Größe des Rahmenlayouts entspricht der Größe des größten untergeordneten Frames (plus Auffüllung), ob sichtbar oder nicht (sofern das übergeordnete FrameLayout dies zulässt).

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 LinearLayoutContainers gut funktioniert. Warum sollten Sie sich für FrameLayout entscheiden?

Joey
quelle
0

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?

Dmitry Ryadnenko
quelle
Es gibt kein Gewicht in einem Framelayout
njzk2
0

Versuchen Sie setCropToPadding (true) auf ImageView, dies sollte geholfen werden!

Kidfolk
quelle
0

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

Komal Nikhare
quelle