MotionLayout 的子项忽略 "setVisibility"
MotionLayout's child ignores "setVisibility"
假设我有简单的 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
}
}
}
(颜色设置只是为了演示目的)。
由于某种原因,进度条仍然显示在屏幕上(背景颜色设置正确)。
如果我再次单击,进度条会重新开始。
对我来说,布局似乎以某种方式无效。
我希望在单击视图后隐藏进度条。是动作布局有问题还是我的理解有问题?
如何避免这种效果并隐藏进度条?
谢谢!
是的!我也对此感到非常沮丧。我能够通过将标签 visibilityMode="ignore"
放在我想要的视图的约束标签内来解决它(注意:我为开始和结束约束添加了这个标签)。有关更多信息,您可以查看 this SO post。所以在你的ConstraintSet
里面你需要有一个像这样的Constraint
<Constraint
android:id="@id/progress_bar"
motion:visibilityMode="ignore"/>
为每个视图设置可见性模式。
希望对你有用!
假设我有简单的 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
}
}
}
(颜色设置只是为了演示目的)。
由于某种原因,进度条仍然显示在屏幕上(背景颜色设置正确)。 如果我再次单击,进度条会重新开始。
对我来说,布局似乎以某种方式无效。
我希望在单击视图后隐藏进度条。是动作布局有问题还是我的理解有问题? 如何避免这种效果并隐藏进度条?
谢谢!
是的!我也对此感到非常沮丧。我能够通过将标签 visibilityMode="ignore"
放在我想要的视图的约束标签内来解决它(注意:我为开始和结束约束添加了这个标签)。有关更多信息,您可以查看 this SO post。所以在你的ConstraintSet
里面你需要有一个像这样的Constraint
<Constraint
android:id="@id/progress_bar"
motion:visibilityMode="ignore"/>
为每个视图设置可见性模式。
希望对你有用!