FrameLayout边距不起作用

时间:2011-03-23 07:14:35

标签: android android-layout

我的布局结构是这样的

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

我为FrameLayout中的两个ImageView设置了margin。但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 个答案:

答案 0 :(得分:220)

我自己也有同样的问题,并注意到设置layout_边距不起作用,直到你在XML资源文件中设置ImageView的布局重力即android:layout_gravity="top",或者从代码{{1 }}

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

因此,如果未设置重力,则不会计算保证金。

答案 2 :(得分:7)

添加你的xml这个属性并重新运行

机器人: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);

答案 3 :(得分:1)

取自FrameLayout文档(link

  

框架布局的大小是其最大子项(加上填充)的大小,可见或不可见(如果FrameLayout的父级允许)。

这似乎描述了它会剥去利润的事实。就像上面提到的巨石一样,你可以尝试切换到填充,因为如果正确完成它可以用来产生类似的效果。

出于好奇,你提到它在使用LinearLayout容器时工作正常,为什么选择FrameLayout?

答案 4 :(得分:0)

你试过android:layout_gravity吗?尝试在ImageViews中使用android:padding而不是android:layout_margin。 AFAIK边距在Frame布局上无法正常工作。我甚至不得不为此目的编写一次自定义布局。顺便说一下,你想怎么想把你的ImageViews?

答案 5 :(得分:0)

尝试setCropToPadding(true)到ImageView,这应该有所帮助!

答案 6 :(得分:0)

你必须设置你的ImageView的布局重力顶部,即android:layout_gravity =&#34; top&#34;在XML资源文件中,或从代码:FrameLayout.LayoutParams.gravity = Gravity.TOP