android - MotionLayout 组可见性问题
问题描述
我有一个约束布局,其中包含一个 RecyclerView、一个 TextInputEditText、一个约束组(它处理 RecyclerView 和 TextInputEditText 的可见性、一个 ImageView 和一个 LottieAnimationView。
它是这样工作的:
启动时,只有 LottieAnimation 可见,直到我的 LiveData 从 repo 获取数据并成功更新。
获取数据后,LottieView 被隐藏并显示 Group 可见性,依次显示 RecyclerView 和 TextInputEditText。
仅当出现错误时才会显示 ImageView,然后隐藏除 ImageView 之外的所有其他视图。
现在我希望当我滚动我的 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 之前和之后的工作示例
前
后
有人可以帮我吗?
解决方案
<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}_*=".."
推荐阅读
- tensorflow - 如何通过 tfds.builder 下载 mnist dataset 1.0.0?
- java - KafkaProducer flush 不阻塞主线程
- laravel - ubuntu 20.04 上的 Jetstream laravel
- python - Plotly:如何使用 plotly express 为多条轨迹设置标记符号形状?
- javascript - 如何在 React 中映射对象数组并相互增加价值?
- sql-server - '3704' 对象关闭时不允许操作 VB 6.0
- python - 将 PyBytes 从 Rust 传递到 Python 时,如何确保正确释放内存?
- python - 请求进来时的 Django Rest Framework 动作
- html - Django 动态显示列表但忽略某些项目
- maple - 如何在 Maple 中将数字转换为字符串?