Android 11下Fragment内输入框聚焦时如何避免软键盘遮挡
Android 11 下Fragment场景软键盘弹出区域适配方案
前置基础配置
- 首先保留Activity在
AndroidManifest.xml中的配置:android:windowSoftInputMode="adjustResize",该配置是软键盘调整布局的基础,Fragment场景下仍然需要生效。 - 给Fragment所在的Activity根布局、Fragment自身的根布局都添加
android:fitsSystemWindows="true"属性,保证WindowInsets事件可以正常传递到Fragment层级。
核心适配代码(Android 11+ 专属)
Android 11之后软键盘状态归属于WindowInsets的IME类型,原有adjustResize逻辑不会主动调整Fragment内部布局,需要手动监听WindowInsets变化动态调整布局padding:
import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat // 在Fragment的onViewCreated方法中添加如下逻辑 override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val fragmentRoot = view.findViewById<ViewGroup>(R.id.你的Fragment根布局ID) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { ViewCompat.setOnApplyWindowInsetsListener(fragmentRoot) { rootView, insets -> // 获取软键盘弹出高度 val imeBottom = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom // 排除导航栏高度的干扰,避免软键盘收起时出现多余空白 val navBarBottom = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom val needBottomPadding = if (imeBottom > navBarBottom) imeBottom else 0 rootView.setPadding( rootView.paddingLeft, rootView.paddingTop, rootView.paddingRight, needBottomPadding ) insets } } }
输入框自动滚动补充适配
如果输入框位于Fragment的滚动布局内,还可以在输入框获取焦点时主动滚动到输入框位置,确保内容完全可见:
// 输入框焦点监听 yourEditText.setOnFocusChangeListener { _, hasFocus -> if (hasFocus) { // 等待软键盘弹出完成后再滚动,避免位置计算偏差 yourEditText.postDelayed({ yourScrollView.smoothScrollTo(0, yourEditText.bottom) }, 150) } }
注意事项
不要给Activity设置
WindowManager.LayoutParams.FLAG_FULLSCREEN全屏标识,该标识会导致adjustResize完全失效。如果需要沉浸式布局,Android 11及以上建议使用WindowInsetsController实现,不会影响软键盘适配逻辑。
问题可视化示意

内容的提问来源于stack exchange,提问作者user16298059
相关产品推荐
相关产品推荐

