Teclado Android monitor teclado expandir/recolher monitor

Como e implemente elegantemente o monitoramento de expansão/recolhimento do teclado

A expansão e o colapso do teclado do Android sempre foram algo muito criticado
. Existem vários métodos, mas basicamente não são muito fáceis de usar. Existem várias restrições.
Aqui está um método de implementação elegante, que usa a altura real do tela e a exibição A comparação de altura da área pode determinar graciosamente se o teclado aparece.
É sabido que o teclado ocupará a área de exibição do aplicativo real, resultando na área de exibição real muito menor que a altura da tela

Puxe o código acima e use-o diretamente


/**
 * CreateTime 2023/2/616:08
 * 键盘 打开/收起 监听 实时回调
 */
class KeyBoardUtil(
    activity: Activity,
    var keyboardVisibilityListener: ((isVisibility: Boolean) -> Unit)?
) {
    
    
    private val contentView: View
    var height: Int = 0
    var isVisibility = false

    init {
    
    
        contentView = activity.window.decorView
        //初始化时先判断当前键盘状态
		 isVisibility = getScreenHeight(activity) > getWindowContentHeight(activity)
        //这个监听的主要作用是在键盘弹出布局发生改变时 动态的通知用户键盘是否弹出
        contentView.viewTreeObserver.addOnGlobalLayoutListener {
    
    
            isVisibility = if (getScreenHeight(activity) > getWindowContentHeight(activity)) {
    
    
                keyboardVisibilityListener?.invoke(true)
                true
            } else {
    
    
                keyboardVisibilityListener?.invoke(false)
                false
            }
        }
    }
    //屏幕高度 固定不变 = 屏幕高度 - titlebar
    private fun getScreenHeight(context: Context?): Int {
    
    
        val displayMetrics = context!!.resources.displayMetrics
        return displayMetrics.heightPixels
    }

    //可视区域高度 会根据显示区域变化 出现键盘时变小 不出现时 大于等于 getScreenHeight()高度
    private fun getWindowContentHeight(activity: Activity?):Int{
    
    
        if (activity==null)return 0
        val rect = Rect()
        activity.window.decorView.getWindowVisibleDisplayFrame(rect)
        return rect.height()
    }

    companion object{
    
    
        /**
         * 隐藏键盘的方法
         *
         * @param context
         */
        fun hideKeyboard(context:Activity?) {
    
    
            val imm = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            // 隐藏软键盘
            imm.hideSoftInputFromWindow(context.window.decorView.windowToken, 0);
        }
    }


}

Como usar

 var keyBoardUtil: KeyBoardUtil = KeyBoardUtil(activity){
    
    isVisibility->
}

fun show(){
    
    
	 if (keyBoardUtil?.isVisibility==true){
    
    //判断当前键盘是否显示
                KeyBoardUtil.hideKeyboard(this)//收起键盘
                keyBoardUtil?.keyboardVisibilityListener={
    
    //键盘收起监听
                    if (!it){
    
    //键盘收起后下一步
                        //todo 操作
                       keyBoardUtil?.keyboardVisibilityListener = null//取消监听,防止后续键盘持续监听
                    }
                }
            }else{
    
    
               //todo 当前键盘未显示 下一步
            }
}

A originalidade não é fácil, irmãos úteis me dão três ha consecutivos

Guess you like

Origin blog.csdn.net/qq_35644925/article/details/128905644