Android ActionMode横屏后Toolbar重新显示且无法自动隐藏问题咨询
问题原因与解决方案
根因分析
- 横竖屏切换触发Activity重建:默认配置下横竖屏切换会销毁并重建Activity,原有Toolbar实例被销毁,重建后新生成的Toolbar没有和当前仍处于激活状态的ActionMode重新绑定隐藏逻辑,系统默认仅在ActionMode首次激活时计算一次Toolbar可见性,重建后不会重新触发该逻辑。
- Fragment视图重绑定时逻辑丢失:ViewPager搭载的ContentFragment在Activity重建后会重新挂载视图,ActionMode的回调没有同步重新触发Toolbar隐藏,导致Toolbar恢复默认可见状态。
- 手动隐藏Toolbar出现首项遮挡的原因:你配置了
windowActionModeOverlay=true让ActionMode覆盖在内容层之上,手动隐藏Toolbar后,ListView的顶部偏移没有适配ActionMode的高度,原本给Toolbar预留的顶部空间消失,列表顶到屏幕顶部就会被覆盖在上方的ActionMode遮挡。
修复方案
- 优先禁止非必要的Activity重建:在
AndroidManifest.xml对应的Activity节点添加configChanges配置,避免横竖屏切换销毁Activity,原有Toolbar和ActionMode的绑定逻辑会持续生效:<activity android:name=".你的Activity名" android:configChanges="orientation|screenSize|screenLayout|keyboardHidden" /> - 若需要保留Activity重建逻辑,需手动保存恢复状态:
- 在Activity的
onSaveInstanceState方法中保存ActionMode激活状态 - 在
onCreate恢复状态时,若检测到ActionMode处于激活状态,主动隐藏Toolbar,同时给ListView设置等于ActionMode高度的顶部padding,避免首项被遮挡 - ActionMode销毁时,恢复Toolbar可见性、复原ListView的顶部padding
- 在Activity的
- 若需要手动控制Toolbar可见性,通过主题属性获取ActionMode标准高度来调整列表偏移:
// 获取系统ActionMode高度 val typedValue = TypedValue() context.theme.resolveAttribute(android.R.attr.actionModeSize, typedValue, true) val actionModeHeight = TypedValue.complexToDimensionPixelSize(typedValue.data, resources.displayMetrics) // 激活ActionMode时设置列表padding listView.setPadding(0, actionModeHeight, 0, 0)
内容的提问来源于stack exchange,提问作者K.tas
相关产品推荐
相关产品推荐

