FrameLayout边距不起作用


79

我的布局结构是这样的

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

我为FrameLayout内的两个ImageView设置了边距。但是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>

Answers:


221

我本人也遇到了同样的问题,并注意到设置layout_边距直到您还设置了ImageView的布局重力(即android:layout_gravity="top"在XML资源文件中或从代码:)后才起作用FrameLayout.LayoutParams.gravity = Gravity.TOP;


21
它有效,但是却让我感到肮脏。我以为我逃脱了CSS
骇客

1
FrameLayout.LayoutParams.gravity在2.3中没有重力选项
JPM 2012年

2
它似乎固定在4.1(可能之前)。有用的知道
pablisco

解决了我在旧的点燃火上遇到的问题。谢谢!
DallinDyer

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); 因此,如果未设置重力,则不会进行边距计算。
Miklos Jakab 2013年

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,则第二种方法将使其崩溃。
莱昂佩尔蒂埃

您可以使用== null控件进行检查。
2015年

这个解决我的问题与margin_top Android上的10
佩德罗·保罗·阿莫林

1

取自FrameLayout文档(链接

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

这似乎描述了它将清除边距的事实。就像提到的巨石一样,您可以尝试切换到填充,因为如果做得好,它可以用来产生类似的效果。

出于好奇,您提到使用LinearLayout容器时它确实可以正常工作,为什么选择FrameLayout?


0

您是否尝试过android:layout_gravity?尝试在您的ImageViews中使用android:padding而不是android:layout_margin。AFAIK页边距在框架布局上无法正常工作。我什至不得不为此目的编写自定义布局。顺便说一句,您想如何使用ImageViews?


帧布局中没有权重
njzk2 2011年

0

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.