通过为其中一个设置负边距重叠视图,以便它侵入另一个视图的边界框。
如果它们应该,它似乎按照你期望的方式重叠布局。但是我不想在不知不觉中做不好的事情遇到更大的问题。模拟器,物理设备,你命名它,当你使用负边距时,一切似乎都正常工作,一个视图侵入另一个视图边界框,并取决于它在布局中声明的方式,它将在另一个视图的上方或下方。
我也知道,自API 21起,我们可以设置translationZ
和elevation
属性,使视图显示在其他视图的上方或下方,但我的关注基本上来自layout_margin
属性的in the documentation明确指出保证金值应为正这一事实,让我引用:
摘录:
指定此视图左侧,顶部,右侧和底部的额外空间。这个空间超出了这个视野的范围。 保证金值应为正。 必须是维值,这是一个附加单位的浮点数,例如“14.5sp”。可用的单位是:px(像素),dp(与密度无关的像素),sp(基于首选字体大小的缩放像素),in(英寸),mm(毫米)......
在最初提出这个问题以来的几年里,我没有任何负余量问题,尽量避免尽可能地使用它们,但确实不遇到任何问题,所以即使文件说明,我并不太担心。
答案 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" />
输出:
答案 3 :(得分:4)
过去可能是不好的做法,但使用Material Design及其浮动动作按钮,现在似乎是不可避免的,并且在许多情况下都需要它。基本上,当你有两个单独的布局时,你不能将它们放入一个RelativeLayout中,因为它们需要明显独立的处理(例如,想想标题和内容),重叠FAB的唯一方法就是让它突然出现一个使用负边距的布局。这会产生可点击区域的其他问题。
答案 4 :(得分:3)
对我而言,关于在TextView上设置负边距(我意识到OP指的是ViewGroup,但我一直在寻找设置负边距的问题而且我在这里登陆了)......我发现了4.0的问题.3(API 15)仅将android:layout_marginTop
或android: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)
您可以使用以下方式代替负边距:
translationX
和 translationY
。
示例:
android:layout_marginBottom = -2dp
android:translationY = -2dp
答案 7 :(得分:0)
我只知道可能会在相当短的时间内完成。但我认为没有问题。请注意屏幕尺寸等,以确保不会意外地制作不应在屏幕上重叠的项目。 (即文本顶部的文字可能是一个坏主意。)