一、应用场景
在Android程序开发中,edit获取焦点是,输入法可以将布局自动顶上去。有一些特别点的需求,正常布局和顶上去的布局会有少许改变,这个时候就需要监听输入法的状态。
二、产生的问题
在Android系统中并没有提供对输入法状态的监听。需要程序自己去识别输入法是否显示和隐藏。
三、解决思路
3.1、监听EditText 在屏幕的纵坐标Y
3.2、如果是Y变小了,说明输入法的软键盘将EditText网上顶了。
3.3、如果是Y变大了,说明输入法的软键盘隐藏。
3.3、如果Y不变,软键盘的状态没有改变。
四、实现代码
4.1、实现OnGlobalLayoutListener接口
public class SoftInputChangeListener implements ViewTreeObserver.OnGlobalLayoutListener {
4.2、覆写onGlobalLayout()方法
@Override
public void onGlobalLayout() {
positionY = getPositionY();
if(positionY<=0)
return;
startMonitor();
}
4.3、监听monitorView在屏幕上的纵坐标
private void startMonitor(){
monitorView.postDelayed(new Runnable() {
@Override
public void run() {
int tempY = getPositionY();
if (tempY == positionY) {
postCount++;
if (MAX_POST_COUNT == postCount) {
resetMonitor();
return;
}
startMonitor();
} else if (tempY < positionY) { //软键盘弹出
resetMonitor();
if(mKeyBoardListen != null)
mKeyBoardListen.onKeyboardChange(true);
} else { //软键盘隐藏
resetMonitor();
if(mKeyBoardListen != null)
mKeyBoardListen.onKeyboardChange(false);
}
}
},50);
}
4.4、监听有三种情况
4.4.1、纵坐标变小
软键盘弹出。
4.4.2、纵坐标变大
软键盘隐藏
4.4.3、纵坐标不变
软键盘状态不变,也有可能onLayout的时间花费太长,没有纵坐标的位置变化,所以重复延时监听3次,3次都没有变化。避免onLayout没有监听到位置变化。