Material 工具栏和 Jetpack 导航故障问题

Material Toolbar & Jetpack navigation glitch issues

我的应用程序使用 Jetpack 导航库 (2.3.5)、Material 工具栏和视图绑定时出现一些奇怪的“故障”和刷新问题。

演示场景如下:3 个不同片段之间的简单导航。

ENTRY POINT ---> SCREEN C ---> SCREEN D

免责声明

抱歉,屏幕上出现了“pseudo-blur 个框”,但我无法显示真实的 UI,如果我出于演示目的更改片段布局,问题就会发生变化。所以我需要使用真正的 UI.

第一步:入口点 ---> 屏幕 C

用户在我们的应用程序中输入:一个空的Material工具栏在屏幕顶部,带有一个标准的后退图标。

然后用户点击一个按钮并进入屏幕 C。 当屏幕 C 完全呈现时,Material 工具栏更新为屏幕标题“屏幕 C”、自定义导航图标和右侧的菜单项(问号图标)。

正如您在 gif 中看到的,导航过程中有 2 个主要问题:

第二步:屏幕 C ---> 屏幕 D

用户在“屏幕 C”上。然后点击一张卡片并进入“屏幕 D”。

屏幕 D 完全呈现后,Material 工具栏更新为屏幕标题“屏幕 D”,自定义后退箭头图标和右侧的菜单项将消失。

正如您在 gif 中看到的那样,还有一些问题:

每个片段中的Material工具栏配置如下:

val navController = NavHostFragment.findNavController(fragment)
val appBarConfiguration = AppBarConfiguration(navController.graph)
setupWithNavController(navController, appBarConfiguration)

这在片段 onViewCreated 回调中调用。

为什么每个导航步骤都会出现这样的渲染问题?

当您将工具栏传递给 setupWithNavController 时,它会在您浏览应用程序时使用导航目的地的 label 值自动设置标题。它的设计让您在 activity 中有一个静态工具栏,目标片段在其下方交换,并且工具栏会更新以反映当前片段。

当您在每个片段中都有一个单独的工具栏时,您会遇到这个问题,即在导航到下一个片段之前标题会在当前片段的工具栏上更新。最简单的解决方法是清除导航图中每个片段的 label 值,然后在每个工具栏上手动设置它们(例如在布局 XML 中)。我看到 Ian Lake(其中一位开发人员)说这些标签确实是为 automatic-title-change 行为设计的,如果你有单独的工具栏

,你不应该使用它们

我们到了 - 在这个问题的评论中: How to remove glitch when navigating between Fragments with different toolbars?

Why are you using labels in your navigation graph at all then? Toolbars have APIs to set a static title, which is certainly appropriate if you know that Toolbar is only associated with one fragment.