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

如何在Fragment中填充菜单?已弃用onCreateOptionsMenu的替代方案

在Fragment中实现ActionBar搜索菜单的正确方式

首先明确:无MenuInflater参数的onCreateOptionsMenu(Menu menu)重载已被弃用,但AndroidX Fragment提供了带MenuInflater参数的替代重载方法,你可以正常使用这个新版本来实现需求。

具体实现步骤:

  1. 启用Fragment的选项菜单
    在Fragment的onCreate方法中调用:

    setHasOptionsMenu(true)
    

    这会告知系统该Fragment需要参与选项菜单的创建。

  2. 使用新版onCreateOptionsMenu方法
    重写带MenuInflater参数的重载方法,在这里加载菜单布局并配置搜索项:

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        super.onCreateOptionsMenu(menu, inflater)
        // 加载菜单布局(比如res/menu/search_menu.xml)
        inflater.inflate(R.menu.search_menu, menu)
        
        // 获取搜索项并配置搜索功能
        val searchItem = menu.findItem(R.id.action_search)
        val searchManager = requireActivity().getSystemService(Context.SEARCH_SERVICE) as SearchManager
        val searchView = searchItem.actionView as SearchView
        
        // 关联搜索配置(可选,如需使用系统搜索框架)
        searchView.setSearchableInfo(searchManager.getSearchableInfo(requireActivity().componentName))
        
        // 设置搜索监听
        searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String?): Boolean {
                // 处理搜索提交逻辑
                searchView.clearFocus()
                return true
            }
    
            override fun onQueryTextChange(newText: String?): Boolean {
                // 处理实时搜索文本变化逻辑
                return true
            }
        })
    }
    
  3. 菜单布局示例(res/menu/search_menu.xml)

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/action_search"
            android:title="@string/search"
            android:icon="@drawable/ic_search"
            app:showAsAction="ifRoom|collapseActionView"
            app:actionViewClass="androidx.appcompat.widget.SearchView"/>
    </menu>
    

注意事项:

  • 如果你的项目仍在使用旧版的android.app.Fragment而非AndroidX的androidx.fragment.app.Fragment,建议尽快迁移到AndroidX,旧版API的废弃不会再得到维护。
  • 若需要处理菜单项的点击事件,重写onOptionsItemSelected方法即可,这个方法目前并未被弃用:
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.action_search -> {
                // 处理搜索项点击(如果需要)
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }
    

内容的提问来源于stack exchange,提问作者Dennis Manicani Jr.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:25:09