FrameLayout margin не работает


моя структура макета выглядит так

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

Я установил маржу для двух ImageView, которые находятся внутри FrameLayout. Но поля FrameLayout отбрасываются, и он всегда устанавливает изображение в верхний левый угол. Если я перейду от FrameLayout к LinearLayout, маржа будет работать правильно. Как с этим справиться ?

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

7 ответов:

у меня был тот же вопрос сам и заметил, что установка layout_ поля не работают, пока вы также не установите гравитацию макета ImageView, т. е. android:layout_gravity="top" в файле ресурсов XML или из кода:FrameLayout.LayoutParams.gravity = Gravity.TOP;.

чтобы было более понятно почему. Так.вызов onLayout() содержит это (по крайней мере, в 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

поэтому, если гравитация равна -1, не будет расчета маржи. И дело в том, что гравитация в FrameLayout.LayoutParams определяется следующим образом:

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

Так что если гравитация не установлен, не будет никакого расчета маржи.

добавьте xml этот атрибут и повторно запустите

android: layout_gravity= "top"

все ок!

и вы не установили новые параметры макета, как это:

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

использовать такой:

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

взято из FrameLayout docs (ссылке)

размер макета фрейма-это размер его самого большого дочернего элемента (плюс заполнение), видимый или нет (если родительский элемент FrameLayout разрешает).

это, кажется, описывает тот факт, что он будет удалять поля. Как упоминалось в boulder, вы можете попробовать переключиться на прокладку, поскольку она может быть использована для получения аналогичного эффекта, если все сделано правильно.

из любопытства, вы упомянули, что он делает отлично работает при использовании LinearLayout контейнер, почему выбор FrameLayout?

вы пробовали android: layout_gravity ? Попробуйте использовать android: padding в Вас ImageViews вместо android: layout_margin. Поля насколько мне известно, не работает должным образом на каркас. Мне даже пришлось написать пользовательский макет для этой цели один раз. Кстати, как вы хотите allign вы ImageViews?

попробуйте setCropToPadding (true) для ImageView ,это должно помочь!

вы должны установить макет gravity top вашего ImageView т. е. android: layout_gravity="top" в файле ресурсов XML или из кода: FrameLayout.Ни.сила тяжести = силе тяжести.ТОП