FrameLayout margin nie działa

Moja struktura layoutu jest taka

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

Ustawiłem margines dla dwóch ImageView, które są wewnątrz FrameLayout. Ale marginesy FrameLayout są odrzucane i zawsze ustawia obraz w lewym górnym rogu. Jeśli zmienię FrameLayout na LinearLayout, margines będzie działał prawidłowo. Jak sobie z tym poradzić ?

<?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>
Author: Vinoth, 2011-03-23

7 answers

Sam miałem ten sam problem i zauważyłem, że ustawianie marginesów layout_ nie działa, dopóki nie ustawisz grawitacji układu ImageView tj. android:layout_gravity="top" w pliku zasobów XML, lub z kodu: FrameLayout.LayoutParams.gravity = Gravity.TOP;.

 217
Author: Andrei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-23 18:42:24

Żeby było jasne dlaczego. FrameLayout.wywołanie onLayout () Zawiera to (przynajmniej w 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

Więc jeśli grawitacja wynosi -1, nie będzie obliczania marginesu. Chodzi o to, że grawitacja w FrameLayout.LayoutParams jest zdefiniowany przez:

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

Więc jeśli grawitacja nie jest ustawiona, nie będzie obliczania marginesu.

 8
Author: Miklos Jakab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-23 15:06:19

Dodaj swój XML ten atrybut i uruchom ponownie

Android:layout_gravity="top"

Wszystko w porządku!

I nie ustawiasz tak nowych layoutów;

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

Użyj TAK:

FrameLayout.LayoutParams llp = (LayoutParams) myFrameLay.getLayoutParams();
llp.height = 100;
llp.width = 100;
myFrameLay.setLayoutParams(llp);
 7
Author: Savas Adar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-01 19:03:18

Wzięte z FrameLayout docs ( link )

Rozmiar układu ramki jest wielkością jego największego potomka (plus wypełnienie), widocznego lub nie (jeśli rodzic FrameLayout na to pozwala).

To wydaje się opisywać fakt, że usunie marginesy. Jak wspomniał boulder, możesz spróbować przełączyć się na padding, ponieważ może być użyty do uzyskania podobnego efektu, jeśli zostanie prawidłowo wykonany.

Z ciekawości wspomniałeś, że działa dobrze, gdy używasz LinearLayout kontener, dlaczego wybór FrameLayout?

 1
Author: Joey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-13 23:53:14

Próbowałeś android: layout_gravity ? Spróbuj użyć android: padding w ImageViews zamiast android: layout_margin. Marginesy AFAIK nie działają poprawnie na układzie Ramki. Musiałem nawet napisać niestandardowy układ w tym celu. BTW, jak chcesz wyrównać obraz?

 0
Author: Dmitry Ryadnenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-25 13:22:00

Spróbuj setCropToPadding (true) do ImageView ,to powinno być pomocne!

 0
Author: kidfolk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-01 14:58:16

Musisz ustawić układ ImageView Gravity top tj. android: layout_gravity="top" w pliku zasobów XML lub z kodu: FrameLayout.LayoutParams.grawitacja = grawitacja.TOP

 0
Author: Komal Nikhare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-20 07:49:00