【问题标题】:MotionLayout's child ignores "setVisibility"MotionLayout 的孩子忽略“setVisibility”
【发布时间】:2020-04-02 01:16:06
【问题描述】:

假设我有一个带有动作布局的简单 UI:

//activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.motion.widget.MotionLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/motion"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutDescription="@transition/motion_scene"
    app:showPaths="true">

    <View
        android:id="@+id/view"
        android:layout_width="0dp"
        android:layout_height="250dp"
        android:background="#CCAA33"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        />

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="visible"
        android:progressTint="#3366CC"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        />
</androidx.constraintlayout.motion.widget.MotionLayout>

带有运动布局场景:

<?xml version="1.0" encoding="utf-8"?>
<MotionScene
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android">

    <Transition
            app:constraintSetStart="@id/collapsed"
            app:constraintSetEnd="@id/expanded"
            app:duration="1000">
        <OnSwipe
                app:touchAnchorId="@id/view"
                app:touchAnchorSide="top"
                app:dragDirection="dragUp" />
    </Transition>
    <ConstraintSet android:id="@+id/collapsed">

    </ConstraintSet>

    <ConstraintSet android:id="@+id/expanded">

    </ConstraintSet>
</MotionScene>

(它什么也没做,因为我出于演示目的剥离了所有内容)。

现在,如果我尝试隐藏进度条(比如点击视图):

//MainActivity.kt

import android.content.res.ColorStateList
import android.graphics.Color
import android.os.Bundle
import android.view.View
import android.widget.ProgressBar
import androidx.appcompat.app.AppCompatActivity


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {

        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        val view = findViewById<View>(R.id.view)
        val progressBar = findViewById<ProgressBar>(R.id.progress_bar)

        view.setOnClickListener {
            view.setBackgroundColor(Color.parseColor("#006699"))
            progressBar.progressTintList = ColorStateList.valueOf(Color.parseColor("#FF3300"))
            progressBar.visibility = View.GONE
        }
    }
}

(颜色仅用于演示目的)。

由于某种原因,进度条仍显示在屏幕上(背景颜色设置正确)。 如果我再次点击,进度条会重新开始进度。

在我看来,布局似乎以某种方式无效。

我希望在查看点击后进度条会被隐藏。运动布局或我的理解有问题吗? 如何避免这种影响并隐藏进度条?

谢谢!

【问题讨论】:

    标签: android android-motionlayout


    【解决方案1】:

    是的!我也对此感到非常沮丧。我可以通过将标签 visibilityMode="ignore" 放在我想要的视图的约束标签内来解决它(注意:我为开始和结束约束添加了这个标签)。欲了解更多信息,您可以查看this SO post。所以在你的ConstraintSet 里面,你需要有一个像这样的Constraint

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

    为每个视图设置可见模式。

    希望对你有用!

    【讨论】:

    • 谢谢!我必须添加: 使其工作。
    • 我也必须使用PropertySet,帖子中显示的内容不起作用,但这是正确的想法。
    • 对我来说,app:visibilityMode 代替了motion:visibilityMode
    猜你喜欢
    • 1970-01-01
    • 2020-05-15
    • 2018-08-28
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多