キーボードの展開/折りたたみモニタリングなどをエレガントに実装します
Android キーボードの拡大と縮小は常に非常に批判されています
. さまざまな方法がありますが、基本的にはあまり使いやすいものではありません. さまざまな制限があります. ここでは
実際の高さを使用するエレガントな実装方法を紹介します画面とディスプレイの領域の高さを比較することで、キーボードがポップアップするかどうかを適切に判断できます。キーボードが
実際のアプリケーションの表示領域を占有するため、実際の表示領域が高さよりもはるかに小さくなることがよく知られています。画面の
上記のコードをプルして直接使用します
/**
* 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);
}
}
}
使い方
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 当前键盘未显示 下一步
}
}