从片段转换到片段时,工具栏闪烁



我的父"活动"中有一个工具栏。有两个孩子的碎片。当我按下FAB按钮在片段之间转换时,工具栏会闪烁。我能做些什么来修复它?非常感谢。

屏幕截图

主要活动

XML:

<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:elevation="4dp"
android:theme="@style/ToolbarTheme"
app:popupTheme="@style/ToolbarTheme"/>

Kotlin:

navController = findNavController(R.id.myNavHostFragment)
setSupportActionBar(findViewById(R.id.toolbar))
setupActionBarWithNavController(navController)

片段A

XML:

<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/floatingActionButton"
android:transitionName="shared_element_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="24dp"
android:clickable="true"
android:focusable="true"
app:elevation="8dp"
/>

Kotlin:

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
postponeEnterTransition()
binding = FragmentListBinding.inflate(inflater, container, false)
binding.root.doOnPreDraw {
startPostponedEnterTransition()
}
return binding.root

片段B

XML:

<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"
android:transitionName="shared_element_container">

Kotlin:

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
sharedElementEnterTransition = MaterialContainerTransform()
sharedElementReturnTransition = MaterialContainerTransform()
}

解决了:对我有效的是,我从主活动中删除了工具栏,并将应用程序主题从"(主题名称("更改为"(主题名("。NoActionBar。DarkActionBar。所以我将工具栏放在主题中,它解决了问题

使用SharedElement过渡设置动画时,需要排除不设置动画的视图。

类似这样的东西:

val animation = MaterialContainerTransform() // Initialize the default animation
animation.excludeTarget(R.id.toolbar, true) // Exclude your toolbar from said animation

对我有效的是,我从主活动中删除了我的工具栏,并将应用程序主题从"(主题名称("更改为"(主题的名称("。NoActionBar。DarkActionBar。所以我将工具栏放在主题中,它解决了问题

MaterialContainerTransform有一个名为setDrawingViewId(@IdRes-int-drawingViewId(的方法

因此,您希望在MaterialContainerTransform对象上这样调用它。

materialContainerTransform.setDrawingViewId(R.id.view_id_here)

该方法的文献:";设置将向其覆盖添加此转换的视图的id。这可用于将动画(包括背景涂鸦(的边界限制为所提供的工程视图的边界,还可使动画按工程视图的相对z顺序绘制。默认情况下,drawingViewId将为android。R.id.content。此外,如果drawingViewId与结束视图的id相同,MaterialContainerTransform将改为将过渡的可绘制项添加到drawingView id的父项中。如果在初始化MaterialContainerTransform期间找不到工程视图,则将引发IllegalArgumentException">

我自己也在寻找这个解决方案@Barry Irvine的答案很有用,因为setScrimColor((方法的文档引用了drawingViewId,这就是粗布颜色填充的内容。你想把它应用到一个不包括工具栏的视图上,你的问题就会消失,而不会摆脱Scrim Color的概念,这显然是有目的的,否则他们就不会包括它。

今天早些时候,我在另一篇相关帖子上发布了同样的答案。

最新更新