Android Studio 带约束布局的Android嵌套滚动视图

xxslljrj  于 2022-12-13  发布在  Android
关注(0)|答案(2)|浏览(195)

我需要一些帮助。我不知道我的代码有什么问题。所以我有这样的XML文件

<?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"
    android:background="@drawable/background_bottom_sheet_radius_16"
    tools:context=".FilterActiveIpdDialog">

    <ImageView
        android:id="@+id/ic_filter_close_active_ipd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginVertical="@dimen/medium_fit"
        android:layout_marginStart="@dimen/medium"
        android:src="@drawable/ic_close_grey"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="ContentDescription,ImageContrastCheck" />

    <com.google.android.material.textview.MaterialTextView
        android:id="@+id/tv_filter_header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/large"
        android:text="@string/filter"
        android:textAppearance="@style/TextAppearance.MaterialComponents.Headline5"
        android:textColor="@color/colorBlackGrade"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="@id/ic_filter_close_active_ipd"
        app:layout_constraintStart_toEndOf="@id/ic_filter_close_active_ipd"
        app:layout_constraintTop_toTopOf="@id/ic_filter_close_active_ipd" />

    <androidx.core.widget.NestedScrollView
        android:id="@+id/layout_rv_filter_active_ipd"
        android:layout_width="wrap_content"
        android:layout_height="@dimen/match_constraint"
        android:layout_marginTop="@dimen/medium"
        android:layout_marginBottom="@dimen/medium"
        app:layout_constraintBottom_toTopOf="@id/btn_filter_dialog_active_ipd"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/ic_filter_close_active_ipd">

        <LinearLayout
            android:id="@+id/layout_bottom_sheet_active_ipd"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rv_hospital"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/medium_fit"
                android:layout_marginEnd="@dimen/small"
                tools:listitem="@layout/item_hospital_filter_active_ipd" />

            <View
                android:id="@+id/div_filter"
                android:layout_width="match_parent"
                android:layout_height="@dimen/micro"
                android:layout_marginTop="@dimen/medium"
                android:background="@color/colorBlackGrade" />

            <androidx.coordinatorlayout.widget.CoordinatorLayout
                android:id="@+id/layout_all_ward_active_ipd"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginStart="@dimen/medium_fit"
                android:layout_marginTop="@dimen/small"
                android:layout_marginEnd="@dimen/small"
                android:paddingVertical="@dimen/small">

                <com.google.android.material.textview.MaterialTextView
                    android:id="@+id/tv_filter__all_ward"
                    style="@style/TextAppearance.AppCompat.Title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="start|center_vertical"
                    android:text="@string/all_wards"
                    android:textColor="@color/colorBlackGrade"
                    android:textSize="@dimen/text_medium" />

                <com.google.android.material.checkbox.MaterialCheckBox
                    android:id="@+id/cb_all_ward"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="end"
                    android:buttonTint="@color/colorPrimaryMid"
                    android:text=""
                    tools:ignore="HardcodedText" />

            </androidx.coordinatorlayout.widget.CoordinatorLayout>

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rv_ward"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/medium_fit"
                android:layout_marginEnd="@dimen/small"
                tools:listitem="@layout/item_ward_filter_active_ipd" />

        </LinearLayout>
    </androidx.core.widget.NestedScrollView>

    <com.google.android.material.button.MaterialButton
        android:id="@+id/btn_filter_dialog_active_ipd"
        style="@style/Widget.CoreTheme.ButtonRadius"
        android:layout_width="@dimen/empty"
        android:layout_height="wrap_content"
        android:layout_marginHorizontal="@dimen/large"
        android:layout_marginBottom="@dimen/medium"
        android:paddingTop="@dimen/medium"
        android:paddingBottom="@dimen/medium"
        android:text="@string/filter"
        android:textColor="@color/colorWhite"
        android:textSize="@dimen/text_small"
        app:backgroundTint="@color/colorSecondaryBase"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        tools:ignore="DuplicateSpeakableTextCheck,TextContrastCheck" />

</androidx.constraintlayout.widget.ConstraintLayout>

我认为问题出在NestedScrollView中。

<androidx.core.widget.NestedScrollView
        android:id="@+id/layout_rv_filter_active_ipd"
        android:layout_width="wrap_content"
        android:layout_height="@dimen/match_constraint"
        android:layout_marginTop="@dimen/medium"
        android:layout_marginBottom="@dimen/medium"
        app:layout_constraintBottom_toTopOf="@id/btn_filter_dialog_active_ipd"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/ic_filter_close_active_ipd">

我不知道怎么了。Android Studio中的设计完美地显示了

但是当我运行应用程序的时候,就像这样。

如果我将NestedScrollView的高度更改为500dp,那么在使用6英寸屏幕的手机时,UI是很好的,但在不同的手机屏幕上,布局会变得混乱。

t3irkdon

t3irkdon1#

由于这是一个BottomSheet,我相信发生的事情是NestedScrollView的高度在开始时是0,当数据到达时,RecyclerView得到填充,但高度仍然是0。
解决此问题的一种方法是在NestedScrollView中使用fillViewport = true
如果这不起作用,您可以使用ViewTreeObserver,因此在片段/Activity中,当数据到达时(我假设您调用的是REST API),您可以将RecyclerView填充到ViewTreeObserver中,如下所示:

nestedScrollView.viewTreeObserver.addOnGlobalLayoutListener(object :
    ViewTreeObserver.OnGlobalLayoutListener {
    override fun onGlobalLayout() {
        nestedScrollView.viewTreeObserver.removeOnGlobalLayoutListener(this)
        // populate recycler view
        nestedScrollView.requestLayout()
    }
})
pwuypxnk

pwuypxnk2#

我通过将状态bottomsheet行为设置为STATE_EXPANDED来修复这个问题。
参考:https://stackoverflow.com/a/62958074/14863421

相关问题