欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Toolbar SearchView的用法

程序员文章站 2024-03-07 20:32:45
...

新建一个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)
}
复制代码

转载于:https://juejin.im/post/5caacfa0e51d452b34424975