背景
开发直播需求时,要求直播间内键盘弹起不压缩界面,也就是不能用windowSoftInputMode#adjustResize这个属性,因为他会压缩界面。要不压缩界面肯定就要用adjustNothing,也就是在这个模式下获取键盘弹起高度,下面就是具体实现。
效果图
Record_2021-03-08-13-54-49_8b18727de96c12142f9e23842beba4f0.gif代码实现
/**
* 获取键盘高度帮助类
*
* @author Liuzj
* @date 2021/3/5
*/
class KeyboardHeightProvider(
activity: FragmentActivity,
parentView: View,
listener: KeyboardHeightListener?,
ignoreStatusBarHeight: Boolean = false
) : PopupWindow(activity) {
interface KeyboardHeightListener {
fun onKeyboardHeightChanged(
keyboardHeight: Int,
keyboardOpen: Boolean,
isLandscape: Boolean
)
}
init {
val popupView = LinearLayout(activity)
popupView.layoutParams =
LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
popupView.viewTreeObserver.addOnGlobalLayoutListener {
val metrics = DisplayMetrics()
activity.windowManager.defaultDisplay.getMetrics(metrics)
val rect = Rect()
popupView.getWindowVisibleDisplayFrame(rect)
var keyboardHeight: Int = metrics.heightPixels - (rect.bottom - rect.top)
val resourceID: Int =
activity.resources.getIdentifier("status_bar_height", "dimen", "android")
if (resourceID > 0 && !ignoreStatusBarHeight) {
keyboardHeight -= activity.resources.getDimensionPixelSize(resourceID)
}
if (keyboardHeight < 100) {
keyboardHeight = 0
}
//是否是横屏
val isLandscape = metrics.widthPixels > metrics.heightPixels
val keyboardOpen = keyboardHeight > 0
listener?.onKeyboardHeightChanged(keyboardHeight, keyboardOpen, isLandscape)
}
contentView = popupView
softInputMode =
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE or WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE
inputMethodMode = INPUT_METHOD_NEEDED
width = 0
height = ViewGroup.LayoutParams.MATCH_PARENT
setBackgroundDrawable(ColorDrawable(0))
parentView.post { showAtLocation(parentView, Gravity.NO_GRAVITY, 0, 0) }
activity.lifecycle.addObserver(object :LifecycleObserver{
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(){
PPLog.d("KeyboardHeightProvider","KeyboardHeightProvider onDestroy")
//activity 关闭的时候释放popupWindow 防止内存泄漏
dismiss()
}
})
}
}
具体使用
activity?.let {
KeyboardHeightProvider(
it,
binding.root,
object : KeyboardHeightProvider.KeyboardHeightListener {
override fun onKeyboardHeightChanged(
keyboardHeight: Int,
keyboardOpen: Boolean,
isLandscape: Boolean
) {
if (keyboardOpen) {
//editText获取光标
editText.requestFocus()
} else {
//editText取消光标
editText.clearFocus()
}
}
}, true
)
}
网友评论