Граница FrameLayout не работает

Моя структура компоновки похожа на это

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

Я установил margin для двух 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>

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Android: layout_gravity = "верх"

все ОК!

и вы не задаете новые параметры макета, такие как:

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);

Ответ 4

Взято из документов FrameLayout (ссылка)

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

вам нужно установить масштаб изображения ImageView top i.e android: layout_gravity = "top" в файле ресурсов XML или из кода: FrameLayout.LayoutParams.gravity = Gravity.TOP