KeyboardChangeListener
KeyboardChangeListener copied to clipboard
由于键盘类型不同,高度不同所导致的切换键盘的时候,没有回调
https://github.com/yescpu/KeyboardChangeListener/blob/cad88f06311774239c40bf284829c0549fa879f6/keyboardchangelib/src/main/java/com/yescpu/keyboardchangelib/KeyboardChangeListener.java#L102-L105
这里的回调仅仅当 mShowFlag != currentShow 条件成立的时候才会回调,这里其实是有问题的。
- 我自己使用的环境是登录界面,该界面存在至少 2 个以上的
EditText,而且inputType的类型不相同的时候,会出现问题,具体操作如下:- 当我在登录界面的时候,上下两个连续的
EditText,一个EditText的inputType为phone,另外一个inputType为textPassword. - 首先,我点击了第一个输入手机号的
EditText,弹出只能输入数字的键盘,他的高度在我的手机上是691 像素 - 输入完之后,我点击输入密码的
EditText, 会弹出可以同时输入账号和密码的键盘,高度为912像素
- 当我在登录界面的时候,上下两个连续的
为了方便测试,我自己在你的基础上添加了额外的测试信息
override fun onGlobalLayout() {
...
Log.d(TAG, "onGlobalLayout() called screenHeight $screenHeight VisibleDisplayHeight $windowBottom, keyboardHeight: $keyboardHeight")
val currentShow = keyboardHeight > MIN_KEYBOARD_HEIGHT
Log.d(TAG, "mShowFlag: $mShowFlag, currentSHow: $currentShow")
if (mShowFlag != currentShow) {
mShowFlag = currentShow
keyboardListener.onKeyboardChange(currentShow, keyboardHeight)
}
}
- 以上的操作流程,正常情况下,输出的日志应该如下
- 正常情况下,键盘切换会经历 旧键盘隐藏 -> 新键盘弹出的一个过程
- 这种情况下,切换不同高度的键盘,也可以正常回调
onKeyboardChange方法,因为mShowFlag != currentShow
// 这个是第一次点击输入手机号的时候
D/KeyboardChangeListener: onGlobalLayout() called screenHeight 1920 VisibleDisplayHeight 1229, keyboardHeight: 691
D/KeyboardChangeListener: mShowFlag: false, currentShow: true
// 这个是第二次点击输入密码 EditText的时候,正常情况,每切换一次,会出现 3 对日志(共6条)
D/KeyboardChangeListener: onGlobalLayout() called screenHeight 1920 VisibleDisplayHeight 1229, keyboardHeight: 691
D/KeyboardChangeListener: mShowFlag: true, currentShow: true
D/KeyboardChangeListener: onGlobalLayout() called screenHeight 1920 VisibleDisplayHeight 1920, keyboardHeight: 0
D/KeyboardChangeListener: mShowFlag: true, currentShow: false
D/KeyboardChangeListener: onGlobalLayout() called screenHeight 1920 VisibleDisplayHeight 1008, keyboardHeight: 912
D/KeyboardChangeListener: mShowFlag: false, currentShow: true
- 然后,当我在两者之间进行反复切换的时候,会出现一种异常情况(小概率出现),没有回调
onKeyboardChange方法。- 根据打印可以知道, 两条日志都是
mShowFlag = true, currentShow = true,但是键盘的高度是不同的,从这里也可以得出解决方法。
- 根据打印可以知道, 两条日志都是
// 异常情况,只会出现 2 对日志(共 4)条日志
D/KeyboardChangeListener: onGlobalLayout() called screenHeight 1920 VisibleDisplayHeight 1008, keyboardHeight: 912
D/KeyboardChangeListener: mShowFlag: true, currentShow: true
D/KeyboardChangeListener: onGlobalLayout() called screenHeight 1920 VisibleDisplayHeight 1229, keyboardHeight: 691
D/KeyboardChangeListener: mShowFlag: true, currentShow: true
- 目前我的解决方法:
- 仅仅是添加了,当键盘处于显示的时候,判断高度是否发生了改变
- 当然更好一点的做法,可能是把高度变化单独抽离出来变为一个接口
if (mShowFlag != currentShow || (mShowFlag && (previousKeyboardHeight != keyboardHeight))) {
mShowFlag = currentShow
keyboardListener.onKeyboardChange(currentShow, keyboardHeight)
}