Fragment布局按钮未被推至键盘上方问题求助:adjustResize无效
我碰到过好几个类似的场景,虽然你已经设置了android:windowSoftInputMode="adjustResize",但因为Fragment嵌套和布局层级的问题,这个属性有时候不会按预期生效。试试下面这几个排查和解决步骤:
检查Fragment根布局(ConstraintLayout)的约束设置
确保你的按钮是和ConstraintLayout的底部直接绑定约束的,而不是用固定的layout_marginBottom或者绝对位置。比如按钮的app:layout_constraintBottom_toBottomOf="parent"要正确设置,这样当父布局被键盘挤压缩小的时候,按钮才会跟着底部一起上移。给Activity的RelativeLayout添加
fitsSystemWindows="true"
在Activity的根RelativeLayout标签里加上android:fitsSystemWindows="true",这个属性会告诉系统布局要考虑系统窗口(比如键盘)的大小变化,配合adjustResize才能正常触发布局调整。将Fragment的ConstraintLayout嵌套进ScrollView
如果Fragment里的内容较多,单纯的ConstraintLayout可能不会自动滚动。把整个ConstraintLayout放在ScrollView里面,这样当键盘弹出时,ScrollView会自动滚动让按钮出现在可视区域。注意ScrollView的直接子布局只能有一个,所以要确保ConstraintLayout是ScrollView的唯一子项。排查是否使用了全屏主题
如果你给Activity设置了全屏主题(比如带有Fullscreen或者windowFullscreen=true的主题),adjustResize会完全失效,因为系统默认全屏窗口不允许调整大小。你需要修改主题,移除全屏相关的属性,比如把主题改成Theme.AppCompat.Light.NoActionBar而不是带Fullscreen的版本。兜底方案:手动监听键盘状态调整布局
如果上面的方法都没用,可以通过监听键盘的显示/隐藏事件,动态修改按钮的位置或者布局的padding。比如注册ViewTreeObserver.OnGlobalLayoutListener,计算键盘的高度,然后给ConstraintLayout设置底部padding,把按钮推上去。不过这个方法比较繁琐,优先用前面的系统方案。
内容的提问来源于stack exchange,提问作者jobin

