Android: 对齐父底部 + 底部边距

我使用了一个相对布局,我想设置按钮在屏幕底部,但是这把它所有的底部,我想有一些边距,这样就有一些空间之间的结束屏幕/视图和按钮。然而,不管我做什么,在2.1 + 上,由于某些原因,按钮边距并没有做任何事情。相对布局包含一个背景,所以我不能,但该边缘。

有人知道怎么解决吗?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="0dp"
android:background="@drawable/background" >


<Button
android:id="@+id/confirm_mobile_button_next"
android:layout_width="fill_parent"
android:layout_height="40dip"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="false"
android:layout_centerHorizontal="false"
android:layout_centerInParent="false"
android:layout_margin="15dp"
android:background="@drawable/button_shape_selector"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:text="@string/confirm_mobile_no_continue"
android:textColor="@color/white"
android:textStyle="bold" />


</RelativeLayout>
95686 次浏览

您可以简单地向 RelativeLayout 添加一个填充,而不是向 Button 添加一个边距,例如 android:paddingBottom="15dp"

通常,我总是使用 API Level 8设置在 Eclipse 预览中测试我的布局。这为大多数设备(包括 ICS 和 JB)提供了相当准确的结果。

试试这样:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >


<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="17dp"
android:text="Button" />

还有一个选择。如果希望设置子边距而不是父边距,则应将 android:layout_marginTop的值设置为所需边距的两倍,然后将 android:layout_centerVertical设置为 true。最上边距被赋予双倍的期望值以补偿最下边距。这样,子视图的顶部和底部边距相等。

<Button
android:id="@+id/confirm_mobile_button_next"
android:layout_width="fill_parent"
android:layout_height="40dip"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="false"
android:layout_centerVertical="true"
android:layout_centerInParent="false"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="30dp"
android:background="@drawable/button_shape_selector"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:text="@string/confirm_mobile_no_continue"
android:textColor="@color/white"
android:textStyle="bold" />

它会给你同样的结果。

另一件你可以做的事情是把一个 View对齐到 RelativeLayout的底部,然后把它的高度设置为你想要使用的底部边距(或者简单地为 layout_marginBottom指定一个值) ,如下所示:

 <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/some_image"
android:adjustViewBounds="true"


/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Some Overlay"
android:padding="3dip"
android:gravity="center_vertical|center_horizontal"


android:layout_above="@+id/empty_view"
android:layout_marginBottom="35dip"
/>
<View
android:id = "@+id/empty_view"
android:layout_height = "30dip"
android:layout_width = "match_parent"
android:visibility="invisible"
android:layout_alignParentBottom="true"
/>


</RelativeLayout>

此示例使用 ImageView填充 RelativeLayout,并将 TextView置于 ImageView之上。

由于我偶然发现了这个问题,并且发现没有适合我的情况的答案,我开始思考了半秒钟,并且通过在 RelativeLayout 示例中的视图上设置一个负边距来解决这个问题:

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginTop="-8dp"
android:layout_marginStart="-8dp">
</RelativeLayout>

这应该对某些人有用。

我认为最好的方法是在 XML 中设置 android: layalignParentbottom 然后在 java 代码后面:

Button confirm_mobile_button_next = (Button)findViewById(R.id.confirm_mobile_button_next)

还有

confirm_mobile_button_next.setTransitionY(-THE_VALUE) or setTransitionX(-THE_VALUE)

我认为最好的办法是:

<...
android:layout_alignParentBottom="true" />

然后在 java 代码后面:

Button confirm_mobile_button_next = (Button)findViewById(R.id.confirm_mobile_button_next)
confirm_mobile_button_next.setTransitionY(-THE_VALUE) or setTransitionX(-THE_VALUE)

可以使用翻译 Y 属性

translateY="-16dp"

最终密码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="0dp"
android:background="@drawable/background">


<Button
android:id="@+id/confirm_mobile_button_next"
android:layout_width="fill_parent"
android:layout_height="40dip"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="false"
android:layout_centerHorizontal="false"
android:layout_centerInParent="false"
android:layout_margin="15dp"
android:background="@drawable/button_shape_selector"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:text="@string/confirm_mobile_no_continue"
android:textColor="@color/white"
android:textStyle="bold"
android:translateY="-16dp" />


</RelativeLayout>

您可以使用 ViewGroup (例如 FrameLayout 或 LinearLayout)来包装视图。在外部视图组中设置 alignParentbottom,然后在内部视图中边缘底部可以工作。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">


<FrameLayout
android:id="@+id/fl_layout"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_layout"
android:text="hello world"
android:layout_marginBottom="50dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
</RelativeLayout>

下面是@franny Zhao 建议的唯一可行的解决方案。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">


<FrameLayout
android:id="@+id/fl_layout"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_layout"
android:text="hello world"
android:layout_marginBottom="50dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</FrameLayout>
</RelativeLayout>

如果像其他人建议的那样向底部对齐的视图添加填充,视图背景也将扩展。如果你有彩色背景,那么视图将看起来像是粘在底部。填充和边距是完全不同的,填充是视图的一部分,但是边距在视图之间留有空间。

现在是2022年,但是如果出于某种原因仍然没有使用 ConstraintLayout,比如我正在修复的一个遗留项目代码,请将此属性用于底部边距类型可视化。

android:translationY="-8dp"

您的代码应该是这样的(在我的例子中是相对布局中的 FAB)

<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/cart_check_out_btn"
style="@style/FABThemeDark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="16dp"
android:text="@string/cart_check_out_btn"
android:textAllCaps="false"
android:translationY="-8dp" />

就像这样

enter image description here