77 votes

La marge de FrameLayout ne fonctionne pas

Ma structure de présentation est la suivante

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

J'ai défini des marges pour les deux ImageView qui sont à l'intérieur de FrameLayout. Mais les marges de FrameLayout sont ignorées et l'image est toujours placée dans le coin supérieur gauche. Si je passe de FrameLayout à LinearLayout, les marges fonctionnent correctement. Comment résoudre ce problème ?

<?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>

220voto

Andrei Points 1929

J'ai eu le même problème et j'ai remarqué que le réglage de l'option layout_ ne fonctionne pas tant que vous n'avez pas défini la gravité de la disposition de votre ImageView, c'est-à-dire android:layout_gravity="top" dans le fichier de ressources XML ou dans le code : FrameLayout.LayoutParams.gravity = Gravity.TOP; .

8voto

Miklos Jakab Points 319

Pour mieux comprendre pourquoi. L'appel FrameLayout.onLayout() contient ceci (dans l'api v2.3.4 au moins) :

    // for each child
    final LayoutParams lp = (LayoutParams) child.getLayoutParams();
    final int gravity = lp.gravity;
    if (gravity != -1) {
        // handle all margin related stuff

Ainsi, si la gravité est de -1, il n'y aura pas de calcul de marge. Et le fait est que la gravité dans FrameLayout.LayoutParams est définie par :

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

Par conséquent, si la gravité n'est pas définie, il n'y aura pas de calcul de marge.

7voto

Savas Adar Points 616

Ajoutez cet attribut à votre xml et exécutez à nouveau.

Android:layout_gravity="top"

Tout va bien !

et vous ne pouvez pas définir de nouveaux paramètres de mise en page de cette manière ;

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

utiliser comme ceci :

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

1voto

Joey Points 370

Tiré de la documentation FrameLayout ( lien )

La taille de la présentation du cadre est la taille de son plus grand enfant (plus le rembourrage), visible ou non (si le parent du FrameLayout le permet).

Cela semble décrire le fait que les marges sont supprimées. Comme boulder l'a mentionné, vous pourriez essayer de passer au remplissage car il peut être utilisé pour produire un effet similaire s'il est fait correctement.

Par curiosité, vous avez indiqué qu'il fonctionnait bien lorsqu'on utilisait un LinearLayout pourquoi avoir choisi FrameLayout ?

0voto

nickes Points 5469

Avez-vous essayé Android:layout_gravity ? Essayez d'utiliser Android:padding dans vos ImageViews au lieu de Android:layout_margin. AFAIK margins ne fonctionne pas correctement sur Frame layout. J'ai même dû écrire un layout personnalisé à cette fin une fois. BTW, comment voulez-vous aligner vos ImageViews ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X