Android 展开Toolbar上SearchView时如何隐藏默认显示的文字

你遇到的多余默认文字是系统原生android.widget.SearchView的兼容问题:不同安卓版本、厂商定制ROM都会给这个原生控件内置默认提示文本,直接调用setQueryHint()在很多机型上没法覆盖内置的默认值,而且原生SearchView的行为在不同版本上差异很大。
下面给两个可落地的解决方法:
方法一(推荐,稳定性最高)
替换为AndroidX兼容包的SearchView,兼容包已经统一了所有系统版本的控件行为,不会出现默认文字无法覆盖的问题。
- 修改菜单布局文件,替换
actionViewClass为兼容包实现,同时补全showAsAction属性:
<?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/action_search" android:icon="@drawable/ic_search" android:title="@string/search" app:actionViewClass="androidx.appcompat.widget.SearchView" app:showAsAction="always|collapseActionView" /> </menu>
补充的
collapseActionView属性是为了让SearchView的展开/收起符合Material Design规范,避免布局错位。
- 修改Activity代码,替换SearchView的导包,微调初始化逻辑:
// 注意替换为androidx的SearchView导包 import androidx.appcompat.widget.SearchView override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.search_menu, menu) val searchItem = menu.findItem(R.id.action_search) val searchView = searchItem.actionView as SearchView // 配置SearchView默认处于图标收起状态,点击后再展开 searchView.isIconifiedByDefault = true searchView.queryHint = "Search in everywhere" searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String?): Boolean { return false } override fun onQueryTextChange(newText: String?): Boolean { // adapter.filter.filter(newText) return true } }) return true }
改完之后所有系统版本上都只会显示你自定义的提示文字,不会再出现多余的默认文本。
方法二(不替换控件的临时方案)
如果你不想换用兼容包控件,可以直接拿到SearchView内部的输入框实例,强制设置hint值覆盖默认文本。
在你原有代码获取到searchView实例之后,追加以下两行代码即可:
// 取到SearchView内部的输入EditText控件 val searchInput = searchView.findViewById<TextView>(android.R.id.search_src_text) // 强制覆盖hint值 searchInput.hint = "Search in everywhere"
这个方案能解决大部分机型上的问题,但因为依赖了系统控件的内部id,后续安卓版本更新如果改动了控件内部id会失效,长期维护的项目还是推荐用方法一。
内容的提问来源于stack exchange,提问作者Bhavin Solanki
相关产品推荐
相关产品推荐

