问题描述
点击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) {
val activityPos = intArrayOf(0, 0)
val dialogPos = intArrayOf(0, 0)
activity.window.decorView.getLocationOnScreen(activityPos)
getLocationOnScreen(dialogPos)
val gap = activity.window.decorView.bottom + activityPos[1] - (bottom + dialogPos[1])
if (height > 10 && gap < height) {
dialog?.window?.decorView?.setPadding(0, 0, 0, height - gap + 50)
} else {
dialog?.window?.decorView?.setPadding(0, 0, 0, 0)
}
}
})
}
override fun onDestroy() {
super.onDestroy()
if (globalListener != null) {
KeyboardUtils.unregisterSoftInputChangedListener(activity, globalListener!!)
}
}
fun registerSoftInputChangedListener(activity: Activity,
listener: OnSoftInputChangedListener?)
: ViewTreeObserver.OnGlobalLayoutListener {
val contentView = activity.findViewById(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(android.R.id.content)
contentView.viewTreeObserver.removeOnGlobalLayoutListener(listener)
}
private fun getContentViewInvisibleHeight(activity: Activity): Int {
val contentView = activity.findViewById(android.R.id.content)
val outRect = Rect()
contentView.getWindowVisibleDisplayFrame(outRect)
return contentView.bottom - outRect.bottom
}
总结
dialog销毁一定要移除global监听,否则回调里面拿到的window是上一次的