通常在我们使用EditText输入内容时,默认会唤起我们系统的键盘,但是在输入完之后,这些键盘收起比较困难。
现在,我来给大家提供两种方法,希望可以帮助到大家:
第一:
这个方法就是,我们在点击的使用,通过事件分发事件中的拦截事件,来对点击时的时间进行拦截,并进行操作,
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (isShouldHideInput(v, ev)) {
InputMethodManager imm = (InputMethodManager) mContext.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);
}
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;
}
这个方法用的就比较广泛了,是要在需要的地方,放上这写代码就可以了。
第二:
这个是对上面方法进行的优化,从而生成的工具类:
隐藏键盘demo
package com.unionpay.guotai.hidekeyboard;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.FrameLayout;
/**
* Date:2019/8/21
* Time:9:27
* author:xiayile
*
* //隐藏键盘
*/
public class AutoHideIMEFrameLayout extends FrameLayout {
public AutoHideIMEFrameLayout(Context context) {
super(context);
}
public AutoHideIMEFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AutoHideIMEFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
Context context = getContext();
if (context == null || !(context instanceof Activity)) {
return super.dispatchTouchEvent(ev);
}
Activity activity = (Activity) context;
View focusView = activity.getCurrentFocus();
if (focusView != null && shouldHideInputMethod(focusView, ev)) {
hideInputMethod(focusView);
}
}
return super.dispatchTouchEvent(ev);
}
private boolean shouldHideInputMethod(View focusView, MotionEvent event) {
Rect rect = new Rect();
focusView.getHitRect(rect);
return !rect.contains((int) event.getX(), (int) event.getY());
}
private void hideInputMethod(View currentFocus) {
if (currentFocus == null) {
return;
}
InputMethodManager imm = (InputMethodManager) currentFocus.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(currentFocus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
调用demo
package com.unionpay.guotai.hidekeyboard;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.view.View;
import android.view.ViewGroup;
/**
* Date:2019/8/21
* Time:9:28
* author:xiayile
*/
public class HideIMEUtil {
public static void wrap(Activity activity) {
ViewGroup contentParent = (ViewGroup) activity.findViewById(android.R.id.content);
wrap(contentParent);
}
public static void wrap(Fragment fragment) {
ViewGroup contentParent = (ViewGroup) fragment.getView().getParent();
wrap(contentParent);
}
public static void wrap(ViewGroup contentParent) {
View content = contentParent.getChildAt(0);
contentParent.removeView(content);
ViewGroup.LayoutParams p = content.getLayoutParams();
AutoHideIMEFrameLayout layout = new AutoHideIMEFrameLayout(content.getContext());
layout.addView(content);
contentParent.addView(layout, new ViewGroup.LayoutParams(p.width, p.height));
}
}
这个可以用在Activity 、Fragment 、ViewGroup中,调用方法,
HideIMEUtil.wrap(this);//键盘管理,点击除editText外区域收起键盘
两种方法各有各的好处,各有各的方便之处,大家根据自己的需求选择,不足之处,大家多多提出意见,谢谢!