在Android中使用负边距是不好的做法?

时间:2012-05-20 12:43:52

标签: android android-layout user-interface overlap margins

负边际演示:

enter image description here

场景

通过为其中一个设置负边距重叠视图,以便它侵入另一个视图的边界框。

思想

如果它们应该,它似乎按照你期望的方式重叠布局。但是我不想在不知不觉中做不好的事情遇到更大的问题。模拟器,物理设备,你命名它,当你使用负边距时,一切似乎都正常工作,一个视图侵入另一个视图边界框,并取决于它在布局中声明的方式,它将在另一个视图的上方或下方。

我也知道,自API 21起,我们可以设置translationZelevation属性,使视图显示在其他视图的上方或下方,但我的关注基本上来自layout_margin属性的in the documentation明确指出保证金值应为正这一事实,让我引用:

  

摘录:
  指定此视图左侧,顶部,右侧和底部的额外空间。这个空间超出了这个视野的范围。 保证金值应为正。   必须是维值,这是一个附加单位的浮点数,例如“14.5sp”。可用的单位是:px(像素),dp(与密度无关的像素),sp(基于首选字体大小的缩放像素),in(英寸),mm(毫米)......

在最初提出这个问题以来的几年里,我没有任何负余量问题,尽量避免尽可能地使用它们,但确实遇到任何问题,所以即使文件说明,我并不太担心。

8 个答案:

答案 0 :(得分:171)

2010年,@ RooGuy(核心Android工程师)表示negative margins had unspecified behavior

2011年,@ RomainGuy表示you can use negative margins on LinearLayout and RelativeLayout

2016年,@ RomainGuy表示they have never been officially supported and won't be supported by ConstraintLayout

虽然很容易解决这个限制。

在基本视图底部添加辅助视图(高度0dp,宽度约束为父级),在底部添加所需的边距。
然后将您的视图放在此视图下方,有效地允许它具有“负”边距,但不必使用任何不受支持的负值。

答案 1 :(得分:15)

如果你想使用负边距,请为容器设置足够的填充,并将 clipToPadding 设置为false,并为其子项设置负边距,这样就不会剪切子视图!

答案 2 :(得分:7)

希望这会对某人有所帮助。这是基于{CommonsWare的答案,使用ConstraintLayout的有效示例代码:

  

在以下位置添加帮助程序视图(高度0dp,宽度限制为父视图)   在基本视图的底部,在底部添加所需的边距。然后   将您的视图置于此视图下方,有效地使其具有   “负”边距,但不必使用任何不受支持的负   值。

示例代码:

<TextView
    android:id="@+id/below"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#F1B36D"
    android:padding="30dp"
    android:text="I'm below"
    android:textColor="#ffffff"
    android:textSize="48sp"
    android:textAlignment="center"
    tools:layout_editor_absoluteX="129dp"
    tools:layout_editor_absoluteY="0dp" />

<android.support.v4.widget.Space
    android:id="@+id/space"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginBottom="32dp"
    app:layout_constraintBottom_toBottomOf="@+id/below"
    app:layout_constraintLeft_toLeftOf="@id/below"
    app:layout_constraintRight_toRightOf="@id/below" />

<TextView
    android:id="@+id/top"
    android:layout_width="100dp"
    android:layout_height="60dp"
    android:textAlignment="center"
    android:textColor="#ffffff"
    android:text="I'M ON TOP!"
    android:background="#676563"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/space" />

输出:

enter image description here

答案 3 :(得分:4)

过去可能是不好的做法,但使用Material Design及其浮动动作按钮,现在似乎是不可避免的,并且在许多情况下都需要它。基本上,当你有两个单独的布局时,你不能将它们放入一个RelativeLayout中,因为它们需要明显独立的处理(例如,想想标题和内容),重叠FAB的唯一方法就是让它突然出现一个使用负边距的布局。这会产生可点击区域的其他问题。

答案 4 :(得分:3)

对我而言,关于在TextView上设置负边距(我意识到OP指的是ViewGroup,但我一直在寻找设置负边距的问题而且我在这里登陆了)......我发现了4.0的问题.3(API 15)仅将android:layout_marginTopandroid:layout_marginBottom设置为负值,例如-2dp。

由于某种原因,TextView根本不显示。它似乎从视图中“消失”(不仅仅是看不见)。

当我尝试使用其他3个版本的layout_margin时,我没有看到问题。

请注意,我没有在真实设备上试过这个,这是使用4.0.3模拟器。这是我发现的第二个奇怪的事情,只有受影响的4.0.3,所以我的新规则是始终使用4.0.3模拟器进行测试:)

我成功地使用android:lineSpacingExtra="-2dp"来减少TextView的下边距,即使我碰巧有android:singleLine="true"也是如此(因此我不会想到行间距会是一个因素)。

答案 5 :(得分:2)

否,您不应使用setRequestProperty("Content-Type", "application/json"); 。相反,您应该使用negative margin。即使负边距有时起作用,但当您以编程方式更改布局时,转换也会有所帮助。使用边距时,视图也不会溢出屏幕。

答案 6 :(得分:2)

您可以使用以下方式代替负边距: translationXtranslationY

示例:

android:layout_marginBottom = -2dp

android:translationY = -2dp

答案 7 :(得分:0)

我只知道可能会在相当短的时间内完成。但我认为没有问题。请注意屏幕尺寸等,以确保不会意外地制作不应在屏幕上重叠的项目。 (即文本顶部的文字可能是一个坏主意。)