在Android中放置重叠两个视图的按钮

时间:2018-03-27 20:42:26

标签: android android-layout

我想放置一个这样的按钮(重叠两个视图,居中):

enter image description here

我尝试使用RelativeLayout和负边距来解决问题,但不知怎的,我不能重叠这两个视图。相反,按钮始终位于图像视图的底部。有什么想法吗?

提前感谢您的帮助!

这是我的代码:

<RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/tour_image"
            android:layout_width="match_parent"
            android:layout_height="220dp" />

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentEnd="true"
            android:layout_marginBottom="-35dp"
            android:layout_marginEnd="16dp">

            <Button
                android:id="@+id/go_to_map_button"
                style="@style/FloatingActionButton.Light"
                android:layout_width="70dp"
                android:layout_height="70dp"
                android:drawableTop="@drawable/ic_directions_walk_color_24dp"
                android:paddingTop="12dp"
                android:text="@string/tour_button_show_map"
                android:textAllCaps="true"
                android:textAppearance="@style/p.Small"
                android:textColor="@color/primary_main" />
        </RelativeLayout>
    </RelativeLayout>

代码导致此布局:

enter image description here

1 个答案:

答案 0 :(得分:2)

在我看来,处理此问题的最佳方法是将现有的顶级RelativeLayout转换为ConstraintLayoutConstraintLayout的开发者指南可在此处找到:https://developer.android.com/training/constraint-layout/index.html

拥有顶级ConstraintLayout后,您可以通过将按钮的顶部和底部约束到视图边缘,将视图定位在两个视图的边缘:

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:id="@+id/top"
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:background="#caf"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>

    <View
        android:id="@+id/bottom"
        android:layout_width="0dp"
        android:layout_height="100dp"
        android:background="#fac"
        app:layout_constraintTop_toBottomOf="@+id/top"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"/>

    <View
        android:id="@+id/overlap"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginRight="24dp"
        android:background="#fff"
        app:layout_constraintTop_toBottomOf="@+id/top"
        app:layout_constraintRight_toRightOf="@+id/top"
        app:layout_constraintBottom_toBottomOf="@+id/top"/>

</android.support.constraint.ConstraintLayout>

enter image description here

此代码的重要部分是&#34;重叠&#34; view有这两个约束:

app:layout_constraintTop_toBottomOf="@+id/top"
app:layout_constraintBottom_toBottomOf="@+id/top"

这些是说&#34;将我的上边缘与另一个视图的下边缘相匹配&#34;和#34;将我的底边与另一个视图的底边相匹配&#34;。显然这是不可能的,因为视图的高度非零,因此ConstraintLayout会自动定位它,使其居中于另一个视图的边缘。我在上面链接的开发者指南中提供了更多详细信息。