You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用MenuProvider API时,Fragment中如何替代requireActivity().invalidateOptionsMenu()?

在新MenuProvider API中,Fragment里替代requireActivity().invalidateOptionsMenu()的方法

在使用MenuProvider API时,你不需要再调用requireActivity().invalidateOptionsMenu(),而是通过**MenuHost接口的invalidateMenu()方法**来触发菜单刷新。

具体实现方式

根据你添加MenuProvider的对象不同,有两种常用方式:

  • 如果你是把MenuProvider添加到Activity(就像你代码里的requireActivity.addMenuProvider),直接通过Activity调用invalidateMenu()即可,因为Activity本身实现了MenuHost接口。
  • 如果你持有myMenuProvider的引用,也可以通过它获取关联的MenuHost再调用刷新方法。

修改你的onDataChanged方法如下:

fun onDataChanged() {
    // 方式1:通过Activity触发菜单刷新
    requireActivity.invalidateMenu()

    // 方式2:通过MenuProvider获取关联的MenuHost刷新
    myMenuProvider.menuHost?.invalidateMenu()
}

配合MenuProvider更新菜单状态

调用invalidateMenu()后,系统会重新触发MenuProvider的onCreateMenu和onPrepareMenu方法,你可以在onPrepareMenu里根据最新数据动态调整菜单:

private val myMenuProvider = object : MenuProvider {
    override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
        // 初始化菜单布局
        menuInflater.inflate(R.menu.my_fragment_menu, menu)
    }

    override fun onPrepareMenu(menu: Menu) {
        // 根据最新数据更新菜单项的显示/隐藏、标题等
        val targetItem = menu.findItem(R.id.action_target)
        targetItem.isEnabled = /* 你的数据状态判断 */
        targetItem.title = /* 动态更新标题 */
    }

    override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
        // 处理菜单点击逻辑
        return when (menuItem.itemId) {
            R.id.action_target -> {
                // 执行对应操作
                true
            }
            else -> false
        }
    }
}

内容的提问来源于stack exchange,提问作者VIN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:32:20