FrameLayout边距不起作用

Posted

技术标签:

【中文标题】FrameLayout边距不起作用【英文标题】:FrameLayout margin not working 【发布时间】:2011-07-21 02:12:43 【问题描述】:

我的布局结构是这样的

LinearLayout
    FrameLayout
       ImageView
       ImageView
    FrameLayout
    TextView
LinearLayout

我已经为 FrameLayout 内的两个 ImageView 设置了边距。但是 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_
    android:layout_
    android:id="@+id/inner1"
    >
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_
           android:layout_
        >

            <ImageView
             android:layout_ 
             android:layout_ 
             android:id="@+id/favicon"
             android:layout_marginLeft="50px"
             android:layout_marginTop="50px"
             android:layout_marginBottom="40px"
             android:layout_marginRight="70px"      

            />      
            <ImageView
             android:layout_ 
             android:layout_ 
             android:id="@+id/applefavicon" 
             android:layout_marginLeft="100px"
             android:layout_marginTop="100px"
             android:layout_marginBottom="100px"
             android:layout_marginRight="100px"              
            />

        </FrameLayout>  
            <TextView
            android:layout_ 
            android:layout_ 
            android:id="@+id/title"                 
            android:layout_marginLeft="10px"        
            android:layout_marginTop="20px"
            android:textColor="#FFFFFF"  
            android:textSize = "15px"
            android:singleLine = "true"
            />

    </LinearLayout>

【问题讨论】:

【参考方案1】:

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

【讨论】:

框架布局中没有权重【参考方案2】:

取自 FrameLayout 文档 (link)

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

这似乎描述了它会去除边距的事实。就像提到的巨石一样,您可以尝试切换到填充,因为如果操作正确,它可以用来产生类似的效果。

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

【讨论】:

【参考方案3】:

我自己也遇到了同样的问题,并注意到设置 layout_ 边距不起作用,除非您还在 XML 资源文件中设置了 ImageView 的布局重力,即 android:layout_gravity="top",或者来自代码:FrameLayout.LayoutParams.gravity = Gravity.TOP;

【讨论】:

它有效,但它让我觉得很脏。我以为我已经摆脱了 CSS hack 的日子...... FrameLayout.LayoutParams.gravity 在 2.3 中没有重力选项 它似乎已在 4.1 上修复(可能之前)。了解虽然有用 修复了我在旧 kindle fire 上遇到的问题。谢谢! 为了更清楚地说明原因。 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定义为:gravity = a.getInt(com.android.internal.R.styleable.FrameLayout_Layout_layout_gravity, -1); 所以如果gravity没有设置,就不会计算margin。【参考方案4】:

添加你的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);

【讨论】:

所以如果你没有LayoutParams,用第二种方法会崩溃。 您可以使用 if == null 控件进行检查。 这解决了我在 Android 10 上的 margin_top 问题。【参考方案5】:

尝试 setCropToPadding(true) to ImageView ,应该会有帮助!

【讨论】:

【参考方案6】:

为了更清楚地说明原因。 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

所以如果gravity是-1,就不会有margin计算。问题是,FrameLayout.LayoutParams 中的重力由以下内容定义:

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

所以如果没有设置gravity,就不会有margin计算。

【讨论】:

【参考方案7】:

您必须在 XML 资源文件中设置 ImageView 的布局重力顶部,即 android:layout_gravity="top",或者通过代码:FrameLayout.LayoutParams.gravity = Gravity.TOP

【讨论】:

以上是关于FrameLayout边距不起作用的主要内容,如果未能解决你的问题,请参考以下文章

运行时的WPF窗口边距不起作用

ConstraintLayout 的问题 - 垂直边距不起作用

Android:以编程方式在 FrameLayout 中设置边距 - 不起作用

CollectionView 边距不一样

安卓。设置左边距/右边距不起作用

php echo html - 左边距不起作用