如何在Fragment中填充菜单?已弃用onCreateOptionsMenu的替代方案
在Fragment中实现ActionBar搜索菜单的正确方式
首先明确:无MenuInflater参数的onCreateOptionsMenu(Menu menu)重载已被弃用,但AndroidX Fragment提供了带MenuInflater参数的替代重载方法,你可以正常使用这个新版本来实现需求。
具体实现步骤:
启用Fragment的选项菜单
在Fragment的onCreate方法中调用:setHasOptionsMenu(true)这会告知系统该Fragment需要参与选项菜单的创建。
使用新版
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 } }) }菜单布局示例(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.
相关产品推荐
相关产品推荐

