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 个主要问题:
- 屏幕标题“SCREEN C”最初显示为非常大的字体和错误的颜色(白色)。这是 ENTRY POINT 片段中空 Material 工具栏的样式。
- 后退图标最初是标准图标,一段时间后(当整个屏幕呈现时)它被更改为自定义导航图标。
第二步:屏幕 C ---> 屏幕 D
用户在“屏幕 C”上。然后点击一张卡片并进入“屏幕 D”。
屏幕 D 完全呈现后,Material 工具栏更新为屏幕标题“屏幕 D”,自定义后退箭头图标和右侧的菜单项将消失。
正如您在 gif 中看到的那样,还有一些问题:
- 首先,向用户显示标题“SCREEN D”,带有标准后退图标和右侧的菜单项
- 然后,当“SCREEN D”完全呈现时,后退图标为自定义图标,菜单项消失。
每个片段中的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.
我的应用程序使用 Jetpack 导航库 (2.3.5)、Material 工具栏和视图绑定时出现一些奇怪的“故障”和刷新问题。
演示场景如下:3 个不同片段之间的简单导航。
ENTRY POINT ---> SCREEN C ---> SCREEN D
免责声明
抱歉,屏幕上出现了“pseudo-blur 个框”,但我无法显示真实的 UI,如果我出于演示目的更改片段布局,问题就会发生变化。所以我需要使用真正的 UI.
第一步:入口点 ---> 屏幕 C
用户在我们的应用程序中输入:一个空的Material工具栏在屏幕顶部,带有一个标准的后退图标。
然后用户点击一个按钮并进入屏幕 C。 当屏幕 C 完全呈现时,Material 工具栏更新为屏幕标题“屏幕 C”、自定义导航图标和右侧的菜单项(问号图标)。
正如您在 gif 中看到的,导航过程中有 2 个主要问题:
- 屏幕标题“SCREEN C”最初显示为非常大的字体和错误的颜色(白色)。这是 ENTRY POINT 片段中空 Material 工具栏的样式。
- 后退图标最初是标准图标,一段时间后(当整个屏幕呈现时)它被更改为自定义导航图标。
第二步:屏幕 C ---> 屏幕 D
用户在“屏幕 C”上。然后点击一张卡片并进入“屏幕 D”。
屏幕 D 完全呈现后,Material 工具栏更新为屏幕标题“屏幕 D”,自定义后退箭头图标和右侧的菜单项将消失。
正如您在 gif 中看到的那样,还有一些问题:
- 首先,向用户显示标题“SCREEN D”,带有标准后退图标和右侧的菜单项
- 然后,当“SCREEN D”完全呈现时,后退图标为自定义图标,菜单项消失。
每个片段中的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.