Android監聽的軟鍵盤的狀態
阿新 • • 發佈:2019-02-03
有時候需要判斷該軟鍵盤是否彈出:
方法1:
通過InputMethodManager類來判斷,但是isActive()判斷並不準確,有的時候你的鍵盤已經關閉了,但是依然返回ture。
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); //得到InputMethodManager的例項
if (imm.isActive()) {//如果開啟
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,InputMethodManager.HIDE _NOT_ALWAYS
);//關閉/開啟軟鍵盤
}
方法2:
通過判斷佈局中的RelativeLayout的高度,Activity設定:
android:windowSoftInputMode="adjustResize"
然後鍵盤彈出的時候RelativeLayout會被擠壓,從而高度發生變化,由此判斷軟鍵盤的狀態。
為了方便使用,我們自定義一個RelativeLayout:
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.RelativeLayout;
/**
* 監聽軟鍵盤是否處於開啟狀態,使用方式RelativeLayout一樣
*/
public class KeyboardListenRelativeLayout extends RelativeLayout {
private static final String TAG = KeyboardListenRelativeLayout.class.getSimpleName();
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 IOnKeyboardStateChangedListener onKeyboardStateChangedListener;
public KeyboardListenRelativeLayout(Context context) {
super(context);
}
public KeyboardListenRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public KeyboardListenRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setOnKeyboardStateChangedListener(IOnKeyboardStateChangedListener onKeyboardStateChangedListener) {
this.onKeyboardStateChangedListener = onKeyboardStateChangedListener;
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
Log.e(TAG, "b= " + b);
if (!mHasInit) {
mHasInit = true;
mHeight = b;
Log.e(TAG, "mHeight= " + b);
if (onKeyboardStateChangedListener != null) {
onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_INIT);
}
} else {
mHeight = mHeight < b ? b : mHeight;
}
if (mHasInit && mHeight > b) { //mHeight代表鍵盤的真實高度 ,b代表在視窗中的高度 mHeight>b 說明鍵盤隱藏
mHasKeyboard = true;
if (onKeyboardStateChangedListener != null) {
onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_SHOW);
}
}
if (mHasInit && mHasKeyboard && mHeight == b) { // mHeight = b 說明已經彈出
mHasKeyboard = false;
if (onKeyboardStateChangedListener != null) {
onKeyboardStateChangedListener.onKeyboardStateChanged(KEYBOARD_STATE_HIDE);
}
}
}
public interface IOnKeyboardStateChangedListener {
void onKeyboardStateChanged(int state);
}
}
最後給mRelativeLayout設定一個監聽:
mRelativeLayout.setOnKeyboardStateChangedListener(new KeyboardListenRelativeLayout.IOnKeyboardStateChangedListener() {
public void onKeyboardStateChanged(int state) {
switch (state) {
case KeyboardListenRelativeLayout.KEYBOARD_STATE_HIDE://軟鍵盤隱藏
LogUtil.e("Keyboard", "軟鍵盤隱藏");
break;
case KeyboardListenRelativeLayout.KEYBOARD_STATE_SHOW://軟鍵盤顯示
LogUtil.e("Keyboard", "軟鍵盤顯示");
break;
default:
break;
}
}
});
參考不詳…