android 监听键盘隐藏事件,android朋友圈监听键盘状态 点击空白区域隐藏键盘

/**

* 判断键盘是否隐藏

*/

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值