打开Android软键盘时按钮不显示,是否与使用MotionLayout有关?
问题排查与解决方案
结论
该问题和MotionLayout的使用直接相关,同时你配置的软键盘属性也存在冲突问题,具体原因和修复方案如下:
核心原因
- 你配置的
android:windowSoftInputMode="adjustPan|adjustResize"本身存在逻辑冲突,Android系统不会同时生效两个属性,会优先取adjustPan执行,此时窗口不会主动调整尺寸适配软键盘,仅会平移布局内容,很容易导致底部控件被遮挡。 - MotionLayout继承自ConstraintLayout,默认不会响应软键盘弹出触发的窗口尺寸变化重算布局:如果你在对应的MotionScene中定义了固定高度、硬编码的底部边界约束或者过渡规则,窗口resize事件无法同步触发MotionLayout的布局更新,内部的ScrollView也就无法正确获取到可用高度,自然不能滚动到按钮所在位置。
修复步骤
- 修正软键盘配置,仅保留
adjustResize属性:android:windowSoftInputMode="adjustResize",确保窗口会主动调整可用区域适配软键盘。 - 给根节点的MotionLayout添加
android:fitsSystemWindows="true"属性,使其能接收到系统窗口inset变化的回调,正确识别软键盘弹出后的可用布局范围。 - 检查对应MotionScene中的约束规则,删除硬编码的固定高度、固定底部边距配置,将布局的底部约束设置为
app:layout_constraintBottom_toBottomOf="parent",布局高度使用match_parent适配可用空间。 - 如果完成以上配置后按钮仍无法显示,可在Activity中监听软键盘显隐事件,手动调用ScrollView的
scrollTo()/smoothScrollTo()方法滚动到按钮位置,也可以主动调用MotionLayout的requestLayout()方法触发重新布局。
内容的提问来源于stack exchange,提问作者Maryam Memarzadeh
相关产品推荐
相关产品推荐

