You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android如何实现软键盘与页面内容同步平滑上滑效果

软键盘与布局内容同步平移实现方案

前置要求

  • targetSdkVersion ≥ 30(Android 11),低版本系统可自动降级为原有adjustResize行为,无需额外处理
  • 保持当前窗口软输入模式为adjustResize,无需切换到adjustPan

实现步骤

1. 开启窗口边到边模式

在Activity的onCreate方法中添加以下配置,让应用内容可以延伸到系统手势导航栏、状态栏区域,为软键盘动画提供基础:

// Kotlin 示例
WindowCompat.setDecorFitsSystemWindows(window, false)
// Java 示例
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);

2. 注册软键盘动画回调

给根布局(也就是你提到的垂直方向LinearLayout)添加WindowInsetsAnimation回调,监听软键盘的动画进度,同步调整内容的Y轴偏移:

// Kotlin 示例
val rootLayout = findViewById<LinearLayout>(R.id.root_layout)
ViewCompat.setWindowInsetsAnimationCallback(rootLayout, object : WindowInsetsAnimationCompat.Callback(DISPATCH_MODE_STOP) {

    var startBottomOffset = 0
    var isImeAnimation = false

    override fun onPrepare(animation: WindowInsetsAnimationCompat) {
        super.onPrepare(animation)
        // 判断当前动画是否为软键盘触发
        if (animation.typeMask and WindowInsetsCompat.Type.ime() != 0) {
            isImeAnimation = true
            // 记录动画开始前根布局的底部偏移
            startBottomOffset = rootLayout.paddingBottom
        }
    }

    override fun onProgress(
        insets: WindowInsetsCompat,
        runningAnimations: MutableList<WindowInsetsAnimationCompat>
    ): WindowInsetsCompat {
        if (!isImeAnimation) return insets

        // 获取软键盘当前的高度
        val imeHeight = insets.getInsets(WindowInsetsCompat.Type.ime()).bottom
        // 获取导航栏高度,避免重复计算
        val navBarHeight = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom
        val targetPadding = if (imeHeight > navBarHeight) imeHeight else navBarHeight

        // 同步调整根布局的底部padding,让内容和软键盘同步移动
        rootLayout.setPadding(
            rootLayout.paddingLeft,
            rootLayout.paddingTop,
            rootLayout.paddingRight,
            targetPadding
        )
        return insets
    }

    override fun onEnd(animation: WindowInsetsAnimationCompat) {
        super.onEnd(animation)
        isImeAnimation = false
    }
})

3. 适配RecyclerView滚动行为

给RecyclerView添加以下配置,确保软键盘弹出时列表内容不会出现跳跃,同时支持滚动到列表顶部:

  • 在XML中给RecyclerView设置android:clipToPadding="false"属性,允许列表内容延伸到padding区域
  • 聊天类列表常用的android:stackFromEnd="true"属性可以正常生效,不需要额外修改

注意事项

  • 不要给根布局设置android:fitsSystemWindows="true"属性,否则会覆盖边到边配置导致动画失效
  • 如果界面存在状态栏、导航栏适配需求,可单独给对应控件处理padding,不需要全局设置fitsSystemWindows
  • Android 10及以下系统没有软键盘动画API,会自动回退到原有的adjustResize行为,不会出现兼容性问题

内容的提问来源于stack exchange,提问作者user246392

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:24:04