如何在布局中将视图居中而不重叠其他视图

时间:2018-06-20 14:27:07

标签: android xml android-layout

上下文

我有一个带有两个视图的FrameLayout:一个ImageButton和一个TextView。

The base layout

我想要的东西:

  • ImageButton应该包装其内容
  • ImageButton位于布局的左侧
  • TextView位于布局的中心
  • TextView应该包装其内容,但不能与ImageButton重叠,例如在此示例Overlapping text

我的第一个解决方案

使用RelativeLayout避免重叠。

<RelativeLayout
    android:id="@+id/dialog_header"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageButton
        android:id="@+id/dialog_close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_padding="20dp"
        android:src="@drawable/btn_close"
        android:layout_alignParentStart="true"/>

    <TextView
        android:id="@+id/dialog_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Some text"
        android:textSize="17sp"
        android:textAlignment="center"
        android:layout_toEndOf="@id/dialog_close"
        android:layout_centerVertical="true"/>
</RelativeLayout>

但是现在,TextView不在布局中居中:而是在ImageButton和Parent的末尾之间居中。 Text not centered

我无法添加按钮大小的边距,因为我实际上并不知道按钮的大小。

我的第二个解决方案

保留RelativeLayout,并添加一个不可见的假按钮(与第一张图片相同,因此大小相同)。并在两个按钮之间居中放置TextView。

<RelativeLayout
    android:id="@+id/dialog_header"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageButton
        android:id="@+id/dialog_close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_padding="20dp"
        android:src="@drawable/btn_close"
        android:layout_alignParentStart="true"/>

    <TextView
        android:id="@+id/dialog_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Some text"
        android:textSize="17sp"
        android:textAlignment="center"
        android:layout_toEndOf="@id/dialog_close"
        android:layout_toStartOf="@id/dialog_margin"
        android:layout_centerVertical="true"/>

    <ImageButton
        android:id="@+id/dialog_margin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_padding="20dp"
        android:src="@drawable/btn_close"
        android:layout_alignParentEnd="true"
        android:visibility="invisible"/>

</RelativeLayout>

导致我想要的行为的原因: Result with fake button

但是我觉得使用假按钮不是正确的方法。

是否有另一种解决方案可以使视图居中并避免重叠,而不是使用这种看不见的假按钮技巧?

如果能带来解决方案(约束,线性...),我可以轻松使用其他布局

感谢您的回答!

3 个答案:

答案 0 :(得分:0)

我不确定您是否也需要FrameLayout。假设我了解您要完成的工作,则可以仅使用RelativeLayout作为基本布局。

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content"
    android:layout_width="match_parent">

    <RelativeLayout
        android:id="@+id/dialog_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageButton
            android:id="@+id/dialog_close"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:padding="20dp"
            android:src="@drawable/btn_close" />

        <TextView
            android:id="@+id/dialog_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_toEndOf="@id/dialog_close"
            android:text="Some very long text which will overlap my button and I dont want that."
            android:textSize="17sp"
            android:gravity="center"
            android:layout_marginEnd="75dp"/>

    </RelativeLayout>

</FrameLayout>

答案 1 :(得分:0)

为了使文本看起来居中,父布局两端的边距必须相等。因此,无需添加假按钮,您就可以在等于按钮宽度的文本中添加margin_right。

<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent">

<RelativeLayout
    android:id="@+id/dialog_header"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageButton
        android:id="@+id/dialog_close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:padding="20dp"
        android:src="@drawable/btn_close" />

    <TextView
        android:id="@+id/dialog_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/dialog_close"
        android:layout_marginRight = "//value equal to source width"
        android:text="Some very long text which will overlap my button and I dont want that."
        android:textSize="17sp"
        android:gravity="center"/>

  </RelativeLayout>
</FrameLayout>

希望这会有所帮助。

答案 2 :(得分:0)

TextView居中放在ConstraintLayout中,方法是将其内容包装起来,并使用约束将其约束到所有父边界。然后,通过包装ImageButton的内容并将其约束到父对象的顶部和底部,将其垂直居中。最后,将ImageButton的结尾限制为TextView的开头。

<android.support.constraint.ConstraintLayout 
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/dialog_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Some text"
            android:textSize="17sp"
            android:textAlignment="center"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>
        <ImageButton
            android:id="@+id/dialog_close"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_padding="20dp"
            android:src="@drawable/btn_close"
            app:layout_constraintEnd_toStartOf="@id/dialog_title"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.constraint.ConstraintLayout>