首页 > 解决方案 > MotionLayout 组可见性问题

问题描述

我有一个约束布局,其中包含一个 RecyclerView、一个 TextInputEditText、一个约束组(它处理 RecyclerView 和 TextInputEditText 的可见性、一个 ImageView 和一个 LottieAnimationView。

它是这样工作的:

现在我希望当我滚动我的 RecyclerView 时,TextInputEditText 也会滚动。(由于滚动时的分页滞后,我无法使用 NestedScrollView)。

我使用了 MotionLayout。除非它不能正常工作。我的能见度坏了。我的 Lottie Animation 停留在屏幕上。我的布局是这样的:

片段.xml:

<?xml version="1.0" encoding="utf-8"?>

<layout 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">

    <data>

        <variable
            name="ViewModel"
            type="...AllServicesViewModel" />

        <import type="android.view.View" />

    </data>

    <androidx.constraintlayout.motion.widget.MotionLayout
        android:id="@+id/Root_All_Services"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layoutDescription="@xml/scene_all_services_header">

        <ImageView
            android:id="@+id/Illus_Error"
            android:layout_width="350dp"
            android:layout_height="350dp"
            android:layout_margin="16dp"
            android:contentDescription="@string/icd_error_services_unavailable"
            android:scaleType="centerCrop"
            android:src="@drawable/il_error"
            android:visibility="@{ViewModel.message != null ? View.VISIBLE : View.GONE}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            tools:src="@drawable/il_error" />

        <androidx.constraintlayout.widget.Group
            android:id="@+id/Group_Main_Content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="@{ViewModel.loading || ViewModel.message != null ? View.GONE : View.VISIBLE}"
            app:constraint_referenced_ids="TextField_Search,RecyclerView_Services" />

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/TextField_Search"
            style="@style/Mes.TextField.Search"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            android:drawablePadding="-24dp"
            android:hint="@string/action_search"
            android:text="@={ViewModel.searchQuery}"
            android:imeOptions="actionSearch"
            android:padding="24dp"
            android:singleLine="true"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/RecyclerView_Services"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:clipToPadding="false"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/TextField_Search" />

        <com.airbnb.lottie.LottieAnimationView
            android:id="@+id/Anim_Loading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="@{!ViewModel.loading || ViewModel.message != null? View.GONE : View.VISIBLE}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:lottie_autoPlay="true"
            app:lottie_loop="true"
            app:lottie_rawRes="@raw/raw_anim_loading_services" />

    </androidx.constraintlayout.motion.widget.MotionLayout>

</layout>

scene_all_services_header.xml

<?xml version="1.0" encoding="utf-8"?>

<MotionScene xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:motion="http://schemas.android.com/apk/res-auto">

    <Transition
        motion:constraintSetEnd="@+id/end"
        motion:constraintSetStart="@+id/start">
        <OnSwipe
            motion:dragDirection="dragUp"
            motion:onTouchUp="stop"
            motion:touchAnchorId="@+id/TextField_Search" />
    </Transition>

    <ConstraintSet android:id="@+id/start">
        <Constraint
            android:id="@+id/TextField_Search"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            motion:layout_constraintEnd_toEndOf="parent"
            motion:layout_constraintStart_toStartOf="parent"
            motion:layout_constraintTop_toTopOf="parent" />

        <ConstraintOverride
            android:id="@+id/RecyclerView_Services"
            motion:visibilityMode="ignore" />

        <Constraint
            android:id="@+id/Anim_Loading"
            motion:visibilityMode="ignore" />

        <Constraint
            android:id="@+id/Illus_Error"
            motion:visibilityMode="ignore" />

    </ConstraintSet>

    <ConstraintSet android:id="@+id/end">
        <Constraint
            android:id="@+id/TextField_Search"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            motion:layout_constraintBottom_toTopOf="parent"
            motion:layout_constraintEnd_toEndOf="parent"
            motion:layout_constraintStart_toStartOf="parent" />

        <ConstraintOverride
            android:id="@+id/RecyclerView_Services"
            motion:visibilityMode="ignore" />

        <Constraint
            android:id="@+id/Anim_Loading"
            motion:visibilityMode="ignore" />

        <Constraint
            android:id="@+id/Illus_Error"
            motion:visibilityMode="ignore" />

    </ConstraintSet>

</MotionScene>

以下是添加 MotionLayout 之前和之后的工作示例

前

后

有人可以帮我吗?

标签: androidkotlinandroid-xmlandroid-constraintlayoutandroid-motionlayout

解决方案


 <Constraint
        android:id="@+id/RecyclerView_Services"
        motion:visibilityMode="ignore" />

以上消除了对该视图的所有约束!

<Constraint android:id="@+id/RecyclerView_Services">
    <PropertySet motion:visibilityMode="ignore"/>
</Constraint> 

上面删除了所有属性,只留下了忽略。

2.1 支持...

 <ConstraintOverride 
        android:id="@+id/RecyclerView_Services"
        motion:visibilityMode="ignore" />

这会做你所期望的。

约束覆盖

  • 添加或修改属性
  • 不是 IDE 不太支持。
  • 不支持 layout_constraint{Top,Bottom,Left,Right,Start,End}_*=".."

推荐阅读