You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:35:02