新建一个menu文件,类容如下:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/main_search"
android:orderInCategory="100"
android:title="搜索"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always"
/>
</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([email protected])
}
}
复制代码
然后复写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)
}
复制代码