奇技淫巧之-Android監聽鍵盤彈出與隱藏事件
相信看到這個標題,大家都會潛意識覺得:Activity中沒有可以復寫的方法么?或者說,沒有什么listener可以讓我們使用么?
抱歉,真的沒有,我們潛意識都是以為系統會提供,其實系統提供的是InputMethodManager,讓我們控制鍵盤的彈出和隱藏,而不是鍵盤彈出和隱藏觸發事件。
我們在開發中經常會遇到軟鍵盤遮擋住了輸入框,而直接把輸入框往上頂adjustResize這種方法過于暴力影響美觀,我們希望鍵盤彈出時動態的去改變布局。這時候,便用到了監聽鍵盤彈起事件的功能。
正題
好了,進入正題,如何監聽鍵盤的彈出和隱藏呢?
-
目前通用的方法是,由于鍵盤彈起與隱藏,會使得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;
}
}
- 該方法來自于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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!