为什么设备旋转后已设置isIconified=false的SearchView仍处于图标化状态
问题原因
你代码的状态保存、文本恢复逻辑是正常的,查询可以触发就说明搜索文本已经被正确恢复。SearchView旋转后依旧保持图标化,是因为你单独修改isIconified属性没有和它绑定的上层MenuItem状态同步,另外SearchView本身的isIconified切换存在系统兼容问题,直接设置false经常不会触发展开。
修复方案
优先操作MenuItem的展开状态,比直接修改SearchView属性稳定性高很多,修改后的onCreateOptionsMenu代码如下:
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_main_activity, menu) val searchItem = menu.findItem(R.id.item_search) searchView = searchItem.actionView as SearchView searchView.setOnQueryTextListener(QueryListener()) if(!searchViewText.isNullOrEmpty()) { // 直接展开MenuItem,同步触发SearchView展开 searchItem.expandActionView() // 遇到极端情况不展开可以加上下面两行重置状态 // searchView.isIconified = true // searchView.isIconified = false searchView.setQuery(searchViewText, true) // 可选:不需要自动弹出输入法就加上这行 searchView.clearFocus() } return super.onCreateOptionsMenu(menu) }
如果你的menu_main_activity.xml中搜索项配置了app:showAsAction="always|collapseActionView"属性,这个方案可以完全解决展开失效的问题。
如果还要保持列表内容不变,只需要把列表的数据源也通过onSaveInstanceState保存,或者把数据源存到ViewModel中即可,不需要额外修改搜索相关逻辑。
内容的提问来源于stack exchange,提问作者Simone
相关产品推荐
相关产品推荐

