Поле FrameLayout не працює


79

Моя структура макета така

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

Я встановив поля для двох ImageView, які знаходяться всередині FrameLayout. Але поля FrameLayout відкидаються, і вони завжди встановлюють Image у верхньому лівому куті. Якщо я перейду з 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>

Відповіді:


221

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


21
Це працює, але це змушує мене відчувати себе брудно. Я думав, що уникнув часів злому CSS ...
Ерландо,

1
FrameLayout.LayoutParams.gravity не має опції гравітації в 2.3
JPM

2
Здається, це виправлено на 4.1 (можливо, раніше). Корисно знати, хоча
pablisco

виправив проблему, яку я мав на старому вогні. Дякую!
DallinDyer 04.03.13

12
Щоб було зрозуміліше чому. Виклик FrameLayout.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); Отже, якщо гравітація не встановлена, обчислення маржі не буде.
Міклош Якаб

8

Щоб було зрозуміліше чому. Виклик FrameLayout.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);

Отже, якщо гравітація не встановлена, розрахунок маржі не буде.


7

додайте цей атрибут 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);

1
Отже, якщо у вас немає LayoutParams, він вийде з ладу другим способом.
Леон Пелтьє

Ви можете перевірити це за допомогою if == null control.
Савас Адар

Це вирішує мою проблему з margin_top на Android 10.
Педро Пауло Аморім

1

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

Розмір макета кадру - це розмір його найбільшого нащадка (плюс відступ), видимий чи ні (якщо це дозволяє батько FrameLayout).

Це, здається, описує той факт, що це буде позбавляти полів. Як і згаданий валун, ви можете спробувати переключитися на забивку, оскільки його можна використовувати для отримання подібного ефекту, якщо це зробити правильно.

З цікавості ви згадали, що він добре працює при використанні LinearLayoutконтейнера, чому вибір FrameLayout?


0

Ви пробували android: layout_gravity? Спробуйте використати android: padding у вас ImageViews замість android: layout_margin. Поля AFAIK не працюють належним чином при компонуванні кадру. Мені навіть довелося одного разу написати спеціальний макет для цієї мети. До речі, як ви хочете вирівняти ваші ImageViews?


в кадровій
розкладці


0

вам слід встановити вершину гравітації макета ImageView, тобто android: layout_gravity = "top" у файлі XML-ресурсу або з коду: FrameLayout.LayoutParams.gravity = Gravity.TOP

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.