如何通过菜单项在MaterialToolbar中实现SearchView,提交查询无响应如何解决
修复方案
1. 绑定MaterialToolbar到ActionBar
你没有将布局中的MaterialToolbar设置为Activity的支持ActionBar,导致菜单加载逻辑onCreateOptionsMenu没有和Toolbar的实际菜单绑定,你写的搜索监听逻辑没有挂载到真实渲染的SearchView上。
在MainActivity的onCreate方法中添加如下代码:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 新增以下代码 val toolbar = findViewById<MaterialToolbar>(R.id.nav_drawer) setSupportActionBar(toolbar) }
2. 检查SearchView导包一致性
确保MainActivity中导入的SearchView和menu.xml中声明的类一致,必须是AndroidX版本的SearchView:
import androidx.appcompat.widget.SearchView
不要导入系统原生的android.widget.SearchView,两者类型不匹配会导致监听不生效。
3. 修改onCreateOptionsMenu返回值
你当前方法最后返回的是父类的返回值,若父类返回false会导致自定义菜单配置失效,直接返回true即可,修改后的完整代码如下:
override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.top_app_bar, menu) val searchItem = menu?.findItem(R.id.top_nav_search) if(searchItem != null){ val searchView = searchItem.actionView as SearchView searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{ override fun onQueryTextSubmit(query: String?): Boolean { Toast.makeText(this@MainActivity, "Looking for $query", Toast.LENGTH_SHORT).show() // 可选:提交后收起搜索框 searchView.clearFocus() searchItem.collapseActionView() return true } override fun onQueryTextChange(newText: String?): Boolean { return true } }) } // 修改返回值为true return true }
完成以上修改后重新运行即可触发搜索提交的Toast逻辑。
内容的提问来源于stack exchange,提问作者Jay Garzon
相关产品推荐
相关产品推荐

