/**
* 判断键盘是否隐藏
*/
void setViewTreeObserver() {
final ViewTreeObserver observer = parent.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
parent.getWindowVisibleDisplayFrame(rect); //获取除去状态栏之外的屏幕高度
// LogUtils.info("--> rect " + rect.top + " " + rect.bottom + " " + rect.left + " " + rect.right);
int statusBarH = getStatusBarHeight(); //获取状态栏高度
// LogUtils.info("--> statusBarH " + statusBarH);
int screenH = parent.getRootView().getHeight(); //获取屏幕高度
// LogUtils.info("--> screenH " + screenH);
if (rect.top != statusBarH) {
//在这个demo中r.top代表的是状态栏高度,在沉浸式状态栏时r.top=0,通过getStatusBarHeight获取状态栏高度
rect.top = statusBarH; //避免沉浸式状态栏的情况下获取的top=0
}
int keyboardH = screenH - (rect.bottom - rect.top); //获取当前可能的键盘高度 keyboardH != statusBarH的时候即可能键盘出现
// LogUtils.info("--> keyboardH " + keyboardH);
// Log.d(TAG, "screenH= "+ screenH +" &keyboardH = " + keyboardH + " &r.bottom=" + r.bottom + " &top=" + r.top + " &statusBarH=" + statusBarH);
if (keyboardH == mCurrentKeyboardH) {//有变化时才处理,否则会陷入死循环
return;
}
mCurrentKeyboardH = keyboardH;
// LogUtils.info("--> mCurrentKeyboardH " + mCurrentKeyboardH);
mScreenHeight = screenH;//应用屏幕的高度
// mEditTextBodyHeight = edittextbody.getHeight(); // TODO: 2017/1/5
if (keyboardH < 150) {//说明是隐藏键盘的情况
LogUtils.info("--> 隐藏键盘");
Observable.timer(200, TimeUnit.MILLISECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1() {
@Override
public void call(Long aLong) {
ib_recommend.setVisibility(View.VISIBLE);
}
});
return;
} else {
LogUtils.info("--> 显示键盘");
ib_recommend.setVisibility(View.GONE);
}
}
});
}
/**
* 获取状态栏高度
*
* @return
*/
private int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (isShouldHideInput(v, ev)) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(ev);
}
// 必不可少,否则所有的组件都不会有TouchEvent了
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
/**
* 判断键盘是否应该隐藏
* 点击除EditText的区域隐藏
* @param v
* @param event
* @return
*/
public boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] leftTop = {0, 0};
//获取输入框当前的location位置
v.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + v.getHeight();
int right = left + v.getWidth();
if (event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom) {
// 点击的是输入框区域,保留点击EditText的事件
return false;
} else {
return true;
}
}
return false;
}