Android SearchView折叠异常:收起后停在右侧替换Toolbar标题
解决SearchView折叠后停在右侧并替换Toolbar标题的异常问题
嘿,我来帮你搞定这个SearchView折叠后出问题的事儿!从你描述的现象和给出的代码来看,主要是几个配置冲突和状态管理的问题,咱们一步步来修复:
先说说问题根源
- 你同时给SearchView的菜单项设置了
app:actionViewClass和app:actionLayout,这俩属性会冲突,导致自定义的全屏布局没生效,反而打乱了系统SearchView的折叠逻辑 - 初始化时强制
searchView.isIconified = false,直接把SearchView改成展开状态,破坏了它默认的折叠/展开状态流转
步骤1:修复菜单文件的冲突配置
把菜单里的app:actionViewClass删掉,只保留自定义的actionLayout,同时调整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/search" android:icon="@drawable/ic_search_white_24dp" android:title="@android:string/search_go" app:actionLayout="@layout/full_width_search_view" app:showAsAction="always|collapseActionView"/> <!-- 用always确保图标常驻,同时保留折叠行为 --> <item android:id="@+id/btn_create" android:icon="@drawable/ic_add_white_24dp" android:title="@string/create" app:showAsAction="ifRoom|collapseActionView"/> <item android:id="@+id/btn_delete" android:icon="@drawable/ic_delete_white_24dp" android:title="@string/remove" app:showAsAction="ifRoom|collapseActionView"/> </menu>
步骤2:优化自定义SearchView布局
如果你的项目用的是AndroidX,把布局里的SearchView换成AndroidX版本,同时加上默认折叠的属性:
<?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.SearchView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:iconifiedByDefault="true" <!-- 让SearchView默认处于折叠状态 --> android:queryHint="@android:string/search_go"/> <!-- 可选:添加上搜索提示文字 -->
步骤3:调整Activity里的状态管理逻辑
去掉强制展开的代码,改成监听折叠/展开事件,确保折叠时恢复Toolbar的标题:
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.search_create_delete, menu) val searchItem = menu.findItem(R.id.search) val searchView: SearchView = searchItem.actionView as SearchView // 监听SearchView的展开/折叠事件 searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener { override fun onMenuItemActionExpand(item: MenuItem): Boolean { // 展开SearchView时,隐藏Toolbar的标题 supportActionBar?.setDisplayShowTitleEnabled(false) return true } override fun onMenuItemActionCollapse(item: MenuItem): Boolean { // 折叠时恢复Toolbar标题,记得替换成你自己的标题内容 supportActionBar?.setDisplayShowTitleEnabled(true) supportActionBar?.title = "你的Toolbar标题" searchView.clearFocus() // 收起时清除焦点,顺便关掉软键盘 return true } }) // 初始化时让SearchView处于折叠状态 searchItem.collapseActionView() menu.findItem(R.id.btn_delete).isVisible = orderLine.hasCustomer() return super.onCreateOptionsMenu(menu) }
额外提醒
- 确认你的项目用的是统一的依赖库(要么全用AndroidX,要么全用旧的support库),混用容易出奇怪的问题
- 别忘了在Activity的
onCreate方法里设置Toolbar为ActionBar:setSupportActionBar(toolbar)
这样改完之后,SearchView折叠后就会乖乖回到Toolbar右侧的图标状态,不会再乱替换标题啦~
内容的提问来源于stack exchange,提问作者jasperagrante
相关产品推荐
相关产品推荐

