Toolbar SearchView的用法

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值