彻底解决软键盘遮挡DialogFragment

作者: 喂_balabala | 来源:发表于2020-11-27 16:22 被阅读0次
    问题描述

    点击edittext,弹出软键盘,dialog略微上移,edittext和下面的按钮还是被遮挡,上移的部分被切割

    解决方案

    设置dialog的inputMode,取消软键盘弹出自动上移
    监听软键盘弹出事件,动态设置dialog的paddingBottom

    override fun init() {
            dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING)
            globalListener = KeyboardUtils.registerSoftInputChangedListener(activity, object : KeyboardUtils.OnSoftInputChangedListener {
                override fun onSoftInputChanged(height: Int) {
                    dialog?.window?.apply {
                        if (height > 10) {
                            decorView.setPadding(0, 0, 0, 400)
                        } else {
                            decorView.setPadding(0, 0, 0, 0)
                        }
                        attributes = attributes
                    }
                }
            })
        }
    
    override fun onDestroy() {
            super.onDestroy()
            if (globalListener != null) {
                KeyboardUtils.unregisterSoftInputChangedListener(activity, globalListener!!)
            }
        }
    
    fun registerSoftInputChangedListener(activity: Activity,
                                             listener: OnSoftInputChangedListener?)
                : ViewTreeObserver.OnGlobalLayoutListener {
            val contentView = activity.findViewById<View>(android.R.id.content)
            sContentViewInvisibleHeightPre = getContentViewInvisibleHeight(activity)
            val globalListener = ViewTreeObserver.OnGlobalLayoutListener {
                if (listener != null) {
                    val height = getContentViewInvisibleHeight(activity)
                    if (sContentViewInvisibleHeightPre != height) {
                        listener.onSoftInputChanged(height)
                        sContentViewInvisibleHeightPre = height
                    }
                }
            }
            contentView.viewTreeObserver.addOnGlobalLayoutListener(globalListener)
            return globalListener
        }
    
        fun unregisterSoftInputChangedListener(activity: Activity,
                                               listener: ViewTreeObserver.OnGlobalLayoutListener) {
            val contentView = activity.findViewById<View>(android.R.id.content)
            contentView.viewTreeObserver.removeOnGlobalLayoutListener(listener)
        }
    
    private fun getContentViewInvisibleHeight(activity: Activity): Int {
            val contentView = activity.findViewById<View>(android.R.id.content)
            val outRect = Rect()
            contentView.getWindowVisibleDisplayFrame(outRect)
            return contentView.bottom - outRect.bottom
        }
    
    总结

    dialog销毁一定要移除global监听,否则回调里面拿到的window是上一次的

    相关文章

      网友评论

        本文标题:彻底解决软键盘遮挡DialogFragment

        本文链接:https://www.haomeiwen.com/subject/qfixwktx.html