新建一个menu文件,类容如下:
复制代码
其中orderInCategory代表的是优先级。数字越小,优先级越高。
我用的是androidx,所以是androidx.appcompat.widget.SearchView。
如果用的是V7包的话,就把actionViewClass里的类替换为android.support.v7.widget.SearchView
然后在Activity里复写onCreateOptionsMenu方法。
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_main,menu) searchView = (MenuItemCompat.getActionView(menu.findItem(R.id.main_search)) as SearchView).apply { //监听提交事件 setOnQueryTextListener(object :SearchView.OnQueryTextListener{ override fun onQueryTextSubmit(query: String): Boolean { if(!query.isEmpty()){ //TODO } return true } override fun onQueryTextChange(newText: String) = false }) } return super.onCreateOptionsMenu(menu) }复制代码
如果要实现用户按下返回键后清空SearchView的内容。则需要借助反射。
写两个扩展方法:
fun SearchView.isOpen():Boolean{ val searchAutoComplete: SearchView.SearchAutoComplete = findViewById(R.id.search_src_text) return searchAutoComplete.isShown}fun SearchView.close(){ val searchAutoComplete: SearchView.SearchAutoComplete = findViewById(R.id.search_src_text) searchAutoComplete.setText("") this::class.java.getDeclaredMethod("onCloseClicked").run { isAccessible = true invoke(this@close) }}复制代码
然后复写onKeyDown方法
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { if(keyCode == KeyEvent.KEYCODE_BACK){ if(searchView.isOpen()){ searchView.close() return true } } return super.onKeyDown(keyCode, event)}复制代码