android-fragments 在片段之间切换时,如何防止操作栏中的选项菜单图标闪烁?

ryoqjall  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(215)

我试图从过时的setHasOptionsMenu()/onCreateOptionsMenu()方法迁移到新的addMenuProvider()/onCreateMenu()方法,以便显示片段中的选项菜单。使用新的API,当在两个都实现MenuProvider的片段之间导航时,我会在操作栏中看到一个难看的图标延迟/闪烁。
我假设这是由异步生命周期回调引起的:新片段的菜单可能在旧片段的Lifecycle.Event.ON_DESTROY事件触发删除旧菜单项之前被膨胀和添加,从而导致两个菜单同时处于活动状态的短暂时刻。我不知道如何避免这种行为。我尝试在每个片段中从onDestroyView()调用removeMenuProvider()invalidateOptionsMenu(),但没有成功。我还尝试将addMenuProvider()移动到onViewCreated()而不是onCreateView()。旧的setHasOptionsMenu() API不会出现此问题。
最小重建:
1.打开Android Studio,创建一个新项目,然后选择“Bottom Navigation Activity”模板。
1.创建两个菜单资源文件,每个文件至少包含一个带有图标和app:showAsAction="always"的菜单项。
1.在底部导航控制器显示的两个片段中,从onCreateView()中调用以下代码:

requireActivity().addMenuProvider(object: MenuProvider {
    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        menuInflater.inflate(/* one of the menus from step 2 */, menu)
    }

    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        return false
    }
}, viewLifecycleOwner)

1.运行应用程序并使用底部的导航栏在这些片段之间切换。您应该会看到如下所示的内容:example gif

wfveoks0

wfveoks01#

从Buganizer上的一些好人那里得到了答案:参见https://issuetracker.google.com/issues/243679672
简言之,使用addMenuProvider(/* provider */, viewLifecycleOwner, Lifecycle.State.RESUMED)
使用addMenuProvider(/* provider */, viewLifecycleOwner, Lifecycle.State.STARTED)似乎可以防止出现短暂的菜单图标不可见的情况(同时还可以防止菜单重叠),尽管这似乎与上面链接中描述的动画期间发生的生命周期状态转换相矛盾...

相关问题