Android:对齐父底端+底边距


68

我使用了相对布局,我想将按钮设置在屏幕底部,但是这将所有按钮都放到了底部,我希望有一些边距,因此在屏幕末端之间有一些空间/视图和按钮。但是,由于某种原因,无论我做什么按钮边距,在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>

Answers:


73

您可以直接向RelativeLayout添加填充,而不是向Button添加空白,例如android:paddingBottom="15dp"

通常,我总是使用API​​级别8设置在Exclipse预览中测试布局。对于包括ICS和JB在内的大多数设备,这给出了相当准确的结果。


11
因为我正在使用应该覆盖所有屏幕的MapView,所以这对我没有做到。我只是使用添加一个TextView具有所需高度的空白android:layout_alignParentBottom="true"并将所需对象(Button在这种情况下)放在上面。
cosmincalistru

4
当textview / button有背景时,此解决方案无效,因为它的大小受paddingBottom影响,并且看起来很恐怖。最好在底部放置不可见的视图
voghDev

没错,@ voghDev。我猜最好的建议是在应用任何随机填充或边距之前先考虑一下布局,因为两者虽然本质上是不同的,但它们通常会产生非常相似的输出。在Stackoverflow上有一篇关于填充和边距之间差异的好文章:stackoverflow.com/questions/5958699/…。尽管涵盖CSS,但相同的原理也适用于Android的布局引擎。
安德烈·

设置视图的填充与设置视图的边距不同。填充定义了视图边界和视图内部内容之间的空间,而“边距”定义了围绕视图边界的空间。这种区别对于“按钮”和“文本视图”之类的视图很重要,在这些视图中设置“填充”而不是“边距”可能会导致视图内的文本被截断。对于Button上面定义的情况尤其如此,因为同时layout_height定义了内容高度+填充。这里更多的信息:stackoverflow.com/a/4619943/2326740

32

您可以做的另一件事是,将一个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>

这个例子填充RelativeLayoutImageView,并定位TextViewImageView


1
请勿列出ID+超过一次的ID 。您应该仅@+id在第一个实例上使用,然后仅@id在XML文件中的其他位置使用。因此,android:id = "@+id/empty_view"在填充开始后您拥有的地方View不应该使用+
SDJMcHattie 2014年

5
使用空间而不是不可见的视图
saiyancoder


我现在所能提供的@DaveHaigh就是这个问题的答案:stackoverflow.com/questions/11160954/… 的含义+有点像java关键字new。如果+在XML中多次使用,则实际上是在告诉系统创建另一个新的ID。我认为该系统足够智能,不能实际创建另一个新系统,但这不是重点。如果系统将来更改,您的代码将中断。我认为,如果您使用正确的设置将其打开,它也会被皮棉拉起。
SDJMcHattie 2014年

20

俞可以使用translateY属性

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>

3

以下是@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>

如果您按照其他人的建议将填充添加到底部对齐的视图中,则视图背景也会扩展。如果您有彩色背景,则视图将看起来像被粘在底部。填充和边距完全不同,填充是视图的一部分,但边距在视图之间留有空间。


2

我认为最好的方法是先在XML中设置android:layout_alignParentBottom,再在其后的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)

2

我认为最好的方法是设置:

<...
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)

2

您可以使用ViewGroup(例如FrameLayout或LinearLayout)包装视图。在外部ViewGroup中设置alignParentBottom,然后marginBottom可以在内部View中工作。

<?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>

1

由于我偶然发现了这个问题,并且没有找到适合我的情况的答案,因此我开始思考了半秒钟,并通过在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>

这对某些人来说应该很有用。


-1

以这种方式尝试:

<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" />


-3

这是另一种选择。如果要设置子项的边距而不是父项的填充,则应将值设置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" />

它将给您相同的结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.