Android:如何确保软键盘平滑向上滑动

Posted

技术标签:

【中文标题】Android:如何确保软键盘平滑向上滑动【英文标题】:Android: How to make sure the soft keyboard slides up smoothly 【发布时间】:2021-11-10 22:43:54 【问题描述】:

下面有一个RecyclerView 和一个EditText。它们是垂直LinearLayout 的子代。当我点击EditText时,软键盘显示,但动画不是很流畅。似乎android首先通过向上推RecyclerView为键盘创建了死区,然后键盘转换到这个空间。

在 Android 11 的 Messages 应用中,我注意到键盘 AND 上面的内容会一起翻译。我怎样才能达到类似的效果?

我使用AdjustResize 作为我的窗口软输入模式。我想避免使用AdjustPan,因为如果它包含许多项目,它将不允许滚动到RecyclerView 的顶部。我注意到消息可以很好地滚动到顶部。

【问题讨论】:

medium.com/androiddevelopers/… 谢谢。这篇文章对我有用。我创建了developer.android.com/reference/android/view/… 的自定义实现。 【参考方案1】:

我遇到了类似的问题,我需要使用键盘平移编辑文本。我使用“AdjustUnspecified”作为我的窗口软输入模式,并执行以下操作以实现想要的行为。

1- 为方便起见,实现以下实用功能

fun Activity.getRootView(): View 
    return findViewById<View>(android.R.id.content)

fun Context.convertDpToPx(dp: Float): Float 
    return TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        dp,
        this.resources.displayMetrics
    )

fun Activity.isKeyboardOpen(): Boolean 
    val visibleBounds = Rect()
    this.getRootView().getWindowVisibleDisplayFrame(visibleBounds)
    val heightDiff = getRootView().height - visibleBounds.height()
    val marginOfError = Math.round(this.convertDpToPx(50F))
    return heightDiff > marginOfError

2- 在您的主要活动中,添加以下内容; (假设你的主activity的layout id是“main_activity_layout”)

在类的顶部声明一个监听器;

    lateinit var listener: ViewTreeObserver.OnGlobalLayoutListener

然后,执行以下操作;

  override fun onResume() 
    super.onResume()
    listener = object : ViewTreeObserver.OnGlobalLayoutListener 
        // Keep a reference to the last state of the keyboard
        private var lastState: Boolean = isKeyboardOpen()

        /**
         * Something in the layout has changed
         * so check if the keyboard is open or closed
         * and if the keyboard state has changed
         * save the new state and invoke the callback
         */
        override fun onGlobalLayout() 
            val isOpen = isKeyboardOpen()
            if (isOpen == lastState) 
                return
             else 
                onKeyboardStateChanged(isOpen)
                lastState = isOpen
            
        
    
    getRootView().viewTreeObserver?.addOnGlobalLayoutListener(listener)


private fun onKeyboardStateChanged(open: Boolean) 
    runOnUiThread 
        if (open) 
            val screenHeight = resources.displayMetrics.heightPixels
            TransitionManager.beginDelayedTransition(main_activity_layout as ViewGroup)
            main_activity_layout.scrollTo(0, screenHeight / 4)
         else 
            TransitionManager.beginDelayedTransition(main_activity_layout as ViewGroup)
            main_activity_layout.scrollTo(0, 0)
        
    


override fun onPause() 
    super.onPause()
    getRootView().viewTreeObserver.removeOnGlobalLayoutListener(listener)

您可以通过在此处修改滚动值来修改平移量

   main_activity_layout.scrollTo(0, screenHeight / 4)

【讨论】:

以上是关于Android:如何确保软键盘平滑向上滑动的主要内容,如果未能解决你的问题,请参考以下文章

安卓移动端软键盘弹出问题解决方案

Android:如何按下软键盘上方的按钮

软输入键盘将我的静态底部视图向上移动 Android Kotlin

软键盘弹出的时候,如何让我的页面自动向上移动

软键盘弹出的时候,如何让我的页面自动向上移动

React Native:Android 软键盘将 View 向上推