奇技淫巧之-Android監聽鍵盤彈出與隱藏事件

jlew8986 8年前發布 | 32K 次閱讀 安卓開發 Android開發 移動開發

相信看到這個標題,大家都會潛意識覺得:Activity中沒有可以復寫的方法么?或者說,沒有什么listener可以讓我們使用么?

抱歉,真的沒有,我們潛意識都是以為系統會提供,其實系統提供的是InputMethodManager,讓我們控制鍵盤的彈出和隱藏,而不是鍵盤彈出和隱藏觸發事件。

我們在開發中經常會遇到軟鍵盤遮擋住了輸入框,而直接把輸入框往上頂adjustResize這種方法過于暴力影響美觀,我們希望鍵盤彈出時動態的去改變布局。這時候,便用到了監聽鍵盤彈起事件的功能。

正題

好了,進入正題,如何監聽鍵盤的彈出和隱藏呢?

  1. 目前通用的方法是,由于鍵盤彈起與隱藏,會使得layout的布局發生變化,通過布局的大小變化觸發的事件實現鍵盤事件的觸發(該方法的缺點是,當設置為全屏模式時,由于布局強制充滿全屏,此時布局大小不會再改變,該方法也就失效了。至少我這邊是這樣的 ->_-> )

    我們可以復寫一個ViewGroup的onSizeChanged方法,然后我們的根布局就是這個AdjustSizeLinearLayout,此時當鍵盤彈起會觸發我們的監聽器。

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.LinearLayout;

public class AdjustSizeLinearLayout extends LinearLayout{

    public AdjustSizeLinearLayout(Context context) {
        super(context);
    }

    public AdjustSizeLinearLayout(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    public AdjustSizeLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private int mChangeSize = 200;

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        Log.e("###xiamin", "change" + w + " " + h + " " + oldw + " " + oldh);
        if (oldw == 0 || oldh == 0)
            return;

        if (boardListener != null) {
            if (oldw != 0 && h - oldh < -mChangeSize) {
                Log.e("###xiamin","鍵盤彈出"+  "change" + w + " " + h + " " + oldw + " " + oldh);
                ToastUtils.showToast(getContext(), "鍵盤彈出");
                boardListener.keyBoardVisable(Math.abs(h - oldh));
            }

            if (oldw != 0 && h - oldh > mChangeSize) {
                ToastUtils.showToast(getContext(), "鍵盤下去");
                Log.e("###xiamin","鍵盤結束"+  "change" + w + " " + h + " " + oldw + " " + oldh);
                boardListener.keyBoardInvisable(Math.abs(h - oldh));
            }
        }
    }

    public interface SoftkeyBoardListener {

        public void keyBoardVisable(int move);

        public void keyBoardInvisable(int move);
    }

    SoftkeyBoardListener boardListener;

    public void setSoftKeyBoardListener(SoftkeyBoardListener boardListener) {
        this.boardListener = boardListener;
    }
}
  1. 該方法來自于github,

KeyboardChangeListener

使用簡單

make activity:
    android:windowSoftInputMode="adjustResize"
java:
 new KeyboardChangeListener(this).setKeyBoardListener(new KeyboardChangeListener.KeyBoardListener() {
            @Override
            public void onKeyboardChange(boolean isShow, int keyboardHeight) {
                Log.d(TAG, "isShow = [" + isShow + "], keyboardHeight = [" + keyboardHeight + "]");
            }
        });

雖然不是根據布局大小變化來判斷的,但是根據ViewTreeObserver.OnGlobalLayoutListener,

@Override
    public void onGlobalLayout() {
        int currHeight = mContentView.getHeight();
        if (currHeight == 0) {
            Log.i(TAG, "currHeight is 0");
            return;
        }
        boolean hasChange = false;
        if (mPreHeight == 0) {
            mPreHeight = currHeight;
            mOriginHeight = currHeight;
        } else {
            if (mPreHeight != currHeight) {
                hasChange = true;
                mPreHeight = currHeight;
            } else {
                hasChange = false;
            }
        }
        if (hasChange) {
            boolean isShow;
            int keyboardHeight = 0;
            if (mOriginHeight == currHeight) {
                //hidden
                isShow = false;
            } else {
                //show
                keyboardHeight = mOriginHeight - currHeight;
                isShow = true;
            }

            if (mKeyBoardListen != null) {
                mKeyBoardListen.onKeyboardChange(isShow, keyboardHeight);
            }
        }
    }

還是根據高度變化來間接判斷鍵盤是否彈出的。

總結

Android系統并沒有給我們提供監聽鍵盤彈出的方法,我們只能自己監聽view的高度變化來間接判斷鍵盤是不是彈出了。同時希望大家有更好的方法提供

 

來自:http://www.jianshu.com/p/ff1d8bcc5253

 

 本文由用戶 jlew8986 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!