水平布局,其中一个元素为固定宽度,另一个元素尽可能宽

时间:2019-03-29 12:54:32

标签: android android-layout

我一直在为一个非常简单的任务而与Android作战,无法终生解决。我尝试了LinearLayoutRelativeLayout,并给了ContraintLayout一事无成。

简化后,我想要具有两个元素的水平布局:

+-----------------------+-------+
|         Hello         | World |
+-----------------------+-------+

每个元素本身都会是一个布局。就本示例而言,每个布局都将包含一个TextView。包含TextView“世界”的元素应为100dp宽。包含TextView“ Hello”的元素应与父级的宽度匹配,但不能与“ World”重叠。基本上是“在尊重其他要素的同时,尽可能地广泛”。

我当前的尝试是:

<RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_orientation="horizontal"
    android:layout_gravity="center">

    <FrameLayout
        android:id="@+id/main_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_orange_dark">
        <TextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:gravity="center"
                android:text="Hello"
                android:textColor="#ffffff"
                android:textSize="32sp" />
    </FrameLayout>

    <LinearLayout
        android:id="@+id/settings_bar"
        android:layout_width="100dp"
        android:layout_height="match_parent"
        android:background="@android:color/holo_green_dark"
        android:orientation="vertical"
        android:layout_toRightOf="@+id/main_frame"
        android:layout_alignParentRight="true">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingBottom="10dp"
            android:paddingTop="10dp"
            android:text="World"/>
    </LinearLayout>
</RelativeLayout>

但是,这就是我得到的:第一个布局完全覆盖了第二个布局。 UI example

3 个答案:

答案 0 :(得分:2)

我保留了您的布局。试试这个:

<RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_orientation="horizontal"
    android:layout_gravity="center">

    <FrameLayout
        android:id="@+id/main_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_marginEnd="100dp" 
        android:background="@android:color/holo_orange_dark">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:gravity="center"
            android:text="Hello"
            android:textColor="#ffffff"
            android:textSize="32sp" />
    </FrameLayout>

    <LinearLayout
        android:id="@+id/settings_bar"
        android:layout_width="100dp"
        android:layout_height="match_parent"
        android:background="@android:color/holo_green_dark"
        android:orientation="vertical"
        android:layout_alignParentEnd="true">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingBottom="10dp"
            android:paddingTop="10dp"
            android:text="World"/>
    </LinearLayout>
</RelativeLayout>

我删除了

android:layout_toRightOf="@+id/main_frame"

来自settings_bar
我添加了

android:layout_alignParentStart="true"

main_frame

答案 1 :(得分:0)

您可以使用layout_weight的{​​{1}}属性来实现这种功能

textview

答案 2 :(得分:0)

这是一个非常简单的布局,可以使用constraintLayout轻松实现。我不包括您用作包装程序的FrameLayoutLinearLayout。您可以将它们添加为宽度和高度与TextView相同的包装器,这不会影响布局。在这里-

<androidx.constraintlayout.widget.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"
    android:orientation="vertical">

    <TextView
        android:id="@+id/hello"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:background="@android:color/holo_orange_light"
        android:gravity="center"
        android:text="Hello"
        android:textSize="25sp"
        app:layout_constraintEnd_toStartOf="@id/world"
        app:layout_constraintStart_toStartOf="parent" />

    <TextView
        android:id="@+id/world"
        android:layout_width="100dp"
        android:layout_height="match_parent"
        android:background="@android:color/holo_purple"
        android:gravity="center"
        android:text="World"
        android:textSize="25sp"
        app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

当您为第二个布局(“世界”)设置app:layout_constraintEnd_toEndOf="parent"时,它将使布局与结尾对齐(右)。我已使用android:layout_width="100dp"设置了其自定义宽度。

对于第一种布局(“ Hello”),您将使用

app:layout_constraintEnd_toStartOf="@id/world"
app:layout_constraintStart_toStartOf="parent"

android:layout_width="0dp"。 0dp实际上不会将宽度设置为0,但会使其在其约束之间伸展。因此,在这种情况下,它将开始的位置(左)设置为父级的开始,并将结束的位置设置为第二版式的开始(左)。因此,它将一直延伸到该布局。

这是它的样子-

Sample layout of above xml with blueprint