Android ScrollView 消失了我的其余部分 UI

Android ScrollView dissapearing the rest of my UI

我是 Android 布局设计的新手。我的问题是,当尝试向我的布局添加 ScrollView 时,它会消失我的 UI 的其余部分。在下面的代码中,当我取消对 ScrollView 的注释时,会发生上述问题。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activity.SettingActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            android:minHeight="?attr/actionBarSize"
            android:theme="?attr/actionBarTheme"
            app:title="Toolbar Title" />
    </LinearLayout>

    <!--    <ScrollView-->
    <!--        android:layout_width="match_parent"-->
    <!--        android:layout_height="match_parent">-->

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="10dp"
        android:layout_marginTop="70dp"
        android:layout_marginEnd="10dp"
        android:layout_marginBottom="1dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Option 1"
            android:textAlignment="center"
            android:textSize="15sp"
            android:textStyle="bold" />

        <RadioGroup
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <RadioButton
                android:layout_width="193dp"
                android:layout_height="48dp"
                android:text="Radio 1" />

            <RadioButton
                android:layout_width="match_parent"
                android:layout_height="48dp"
                android:text="Radio 2" />
        </RadioGroup>

        <View style="@style/Divider" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Option 2"
            android:textAlignment="center"
            android:textSize="15sp"
            android:textStyle="bold" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Option 2 Description"
            android:textAlignment="center" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Sub-option 2.1"
                android:textStyle="bold" />

            <EditText
                android:layout_width="135dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:autofillHints="no"
                android:ems="10"
                android:inputType="numberSigned"
                android:minHeight="48dp"
                android:text="2"
                android:textAlignment="center"
                tools:ignore="LabelFor" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Sub-option 2.2"
                android:textStyle="bold" />

            <EditText
                android:layout_width="135dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:autofillHints="no"
                android:ems="10"
                android:inputType="numberSigned"
                android:minHeight="48dp"
                android:text="3"
                android:textAlignment="center"
                tools:ignore="LabelFor" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Sub-option 2.3"
                android:textStyle="bold" />


            <EditText
                android:layout_width="135dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:autofillHints="no"
                android:ems="10"
                android:inputType="numberSigned"
                android:minHeight="48dp"
                android:text="2"
                android:textAlignment="center"
                tools:ignore="LabelFor" />

        </LinearLayout>

        <View style="@style/Divider" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Option 3"
            android:textAlignment="center"
            android:textSize="15sp"
            android:textStyle="bold" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Option 3.1"
            android:textStyle="bold" />

        <Spinner
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="48dp"
            tools:ignore="DuplicateSpeakableTextCheck" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Option 3.2"
            android:textStyle="bold" />

        <Spinner
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="48dp" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Option 3.3"
            android:textStyle="bold" />

        <Spinner
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:minHeight="48dp" />

        <View style="@style/Divider" />

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Option 4"
            android:textAlignment="center"
            android:textSize="15sp"
            android:textStyle="bold" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <androidx.appcompat.widget.SwitchCompat
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="48dp"
                android:text="Option 4.1" />


            <androidx.appcompat.widget.SwitchCompat
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="48dp"
                android:text="txt_option_4_2" />

            <androidx.appcompat.widget.SwitchCompat
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:minHeight="48dp"
                android:text="txt_option_4_3" />
        </LinearLayout>

    </LinearLayout>

    <!--    </ScrollView>-->

</androidx.constraintlayout.widget.ConstraintLayout>

如何将 ScrollView 正确添加到我的 UI?我也觉得我可以让我的代码变得更好,所以我愿意接受任何与之相关的建议。

注意:我省略了 ID 和硬编码字符串,而不是在此处使用 @string 资源。

不要为 LinearLayout 提供边距和约束,而是像这样将它们移动到 ScrollView

<ScrollView
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginStart="10dp"
    android:layout_marginTop="70dp"
    android:layout_marginEnd="10dp"
    android:layout_marginBottom="1dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

    <!-- Rest of the code -->

    </LinearLayout>

</ScrollView>

并将 LinearLayout 宽度和高度分别更改为 match_parentwrap_contentScrollView 只能有一个 child。虽然,这对您来说不是问题,但只是想提一下。

这取决于您要如何安排根 ConstraintLayout 的子项的关系。如果将它们全部设置为

    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"

然后重叠,后面的隐藏前面的。

因此,您应该使用 app:layout_constraint*** 属性将它们设置为不相互重叠。

由于Whosebug并不是针对技术学习者设计的教程书,建议大家先找到ConstraintLayout的文档阅读一下。