学习android从大三到工作已经差不多有两年了,虽然不能和大神相提评论但现在也算积累了很多的经验,现在想想也应该写一些东西记录一下了。
今天讲一些键盘监听,为啥想说这个呢?因为android并没有给我们最好的键盘监听的方案,也就是说键盘的打开和收起我们是没办法靠原生的API的只能考我们自己。
其实对于键盘的监听也是很简单的一件事情,有一点经验的人都知道,android的键盘在出现和消失的时候都会调用外层布局的onLayout方法去重新布局, 我们只要通过复写父控件上的onLayout方法,和记一个状态变量就可以很简单的解决这个问题。
所有我们可以写一个KeyBoardRelativeLayout 继承 RelativeLayout 来封装事件的监听。要注意的是在activity初始化的时候也会走onLayout的方法所以要注意的是要要精第一次的清空剔除出去
我们需要重写这个view中的onLayout方法
public static final byte KEYBOARD_STATE_SHOW = -3;
public static final byte KEYBOARD_STATE_HIDE = -2;
public static final byte KEYBOARD_STATE_INIT = -1;
private boolean mHasInit = false;
private boolean mHasKeyboard = false;
private int mHeight;
private OnKeyBoardChangeListener onKeyboardStateChangedListener;
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (!mHasInit) {
mHasInit = true;
mHeight = b;
if (onKeyboardStateChangedListener != null) {
onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_INIT);
}
} else {
//mHeight = mHeight < b ? b : mHeight;
}
if (mHasInit && mHeight > b) {
mHasKeyboard = true;
mHeight = b;
if (onKeyboardStateChangedListener != null) {
onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_SHOW);
}
}
if (mHasInit && mHasKeyboard && mHeight < b && Math.abs(mHeight - b) >= 200) {
mHasKeyboard = false;
mHeight = b;
if (onKeyboardStateChangedListener != null) {
onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_HIDE);
}
}
}
public interface OnKeyBoardChangeListener {
public void onKeyboardStateChanged(int state);
}