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

Jua*_*tés 109 user-interface android margins overlap android-layout

负余量演示:

                         在此输入图像描述

场景

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

思考

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

我也知道,自API 21以来我们可以设置translationZelevation 属性使视图显示在其他视图的上方或下方,但我的关注基本上来自这样一个事实,即layout_margin属性的文档中明确指出边缘值应为正,让我引述:

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

在未来的几年,因为最初提出这个问题,我还没有切缘阴性的任何问题,并尽量避免使用它们尽可能多地,但并没有遇到任何问题,所以即使文档指出,我不是太担心它.

Com*_*are 181

2010年,@ RooGuy(核心Android工程师)表示负利润率有未明确的行为.

2011年,@ RomainGuy表示你可以在LinearLayout和上使用负边距RelativeLayout.

2016年,@ RomainGuy表示他们从未获得官方支持,也不会受到支持ConstraintLayout.

尽管如此,很容易解决这个限制.

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

  • 我注意到在**Android 4.4**KitKat中,关于负边距的事情发生了变化(与4.3相比;至少在华硕Nexus 7上).事实证明你需要`android:clipChildren ="false"`和`android:clipToPadding ="false"`你之前没有,或者[事情像这样破坏](http://i.stack.imgur.com/ HvQNb.png). (20认同)
  • 从 ConstraintLayout 2.1 开始,现在支持负边距。https://developer.android.com/jetpack/androidx/releases/constraintlayout#constraintlayout-2.1.0-alpha2 (3认同)
  • @DrewLeSueur:我不会做出这样的假设。我不知道负填充意味着什么。 (2认同)
  • @ 100kg:抱歉,但不支持. (2认同)

Ali*_*Ali 15

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


Vik*_*ngh 12

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

在基本视图的底部添加辅助视图(高度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" />
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述


I.S*_*tep 7

您可以使用: translationXand代替负边距 translationY

例子:

android:layout_marginBottom = -2dp

android:translationY = -2dp
Run Code Online (Sandbox Code Playgroud)


Gáb*_*bor 5

过去这可能是一种不好的做法,但是有了 Material Design 及其浮动操作按钮,现在在许多情况下似乎是不可避免的和必需的。基本上,当你有两个单独的布局,你不能把它们放在一个 RelativeLayout 中,因为它们需要明显单独的处理(例如,想想标题和内容),重叠 FAB 的唯一方法是让它伸出一个使用负边距的布局。这会给可点击区域带来额外的问题。