Android软键盘弹出时如何滚动全布局避免底部控件与上层文本重叠
我的UI布局如下所示。
所有控件都位于ConstraintLayout内部的NestedScrollView中,按钮对齐在布局底部。我希望软键盘弹出时整个布局向上滚动,直到底部按钮完全可见。我已尝试设置android:windowSoftInputMode="adjustResize|stateVisible",但该配置只会让底部按钮上移,导致其与TextView 2、TextView 3发生重叠。请问有没有方法可以让整个布局上移,保证TextView 2、TextView 3和按钮都可见且互不重叠,顶部的TextView 1被遮挡也没有关系。
解决方案
- 修改AndroidManifest.xml对应Activity的软键盘配置,使用
android:windowSoftInputMode="adjustResize"即可,如果不需要页面启动就弹出软键盘可以删除stateVisible参数。 - 给布局中的NestedScrollView添加
android:fillViewport="true"属性,该属性会让NestedScrollView的子布局撑满滚动控件的可视区域,避免约束布局的底部约束失效。 - 调整ConstraintLayout内部的控件约束规则:
- 顶部TextView1正常约束到父布局顶部即可,不需要额外设置
- TextView2、TextView3按垂直顺序依次约束,保证两者的相对位置正常
- 底部按钮的顶部约束到TextView3的底部,设置不小于16dp的顶部边距,同时将按钮的底部约束到ConstraintLayout的底部,保证软键盘弹出时按钮不会直接覆盖在TextView3上。
- 如果调整后仍存在重叠问题,可以添加软键盘高度监听,软键盘弹出时主动控制NestedScrollView滚动到底部,参考代码如下:
val rootView = window.decorView.findViewById<View>(android.R.id.content) rootView.viewTreeObserver.addOnGlobalLayoutListener { val visibleRect = Rect() rootView.getWindowVisibleDisplayFrame(visibleRect) val keyboardHeight = rootView.height - visibleRect.bottom // 软键盘高度超过屏幕15%判定为弹出状态 if (keyboardHeight > rootView.height * 0.15) { nestedScrollView.post { nestedScrollView.fullScroll(View.FOCUS_DOWN) } } }
内容的提问来源于stack exchange,提问作者Droidme
相关产品推荐
相关产品推荐


