1. 程式人生 > >Android監聽的軟鍵盤的狀態

Android監聽的軟鍵盤的狀態

有時候需要判斷該軟鍵盤是否彈出:

方法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;
                }
            }
        });

參考不詳…