一.在Fragment中实现点击其他位置隐藏金盘
问题:Fragment无法重写dispatchTouchEvent方法
Fragment连接Activity的方法:https://blog.csdn.net/qq_34902522/article/details/77963129
触摸事件分类:
https://blog.csdn.net/xyz_lmn/article/details/12517911
一.解决方法
1.先创建一个interface,参数不能乱写
public interface OnHideKeyboardListener {
public boolean hideKeyboard(KeyEvent event);
}
2.调用上面的接口,然后把fragment的父Activiy在顶部声明一下,然后重写onAttach方法(不过目前已经不提倡用activity为参数了了)
MainActivity mainActivity;
//获取通信
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mainActivity = (MainActivity) activity;
mainActivity.setOnHideKeyboardListener(this);
}
@Override
public boolean hideKeyboard(KeyEvent event) {
return false;
}
3.在父Activity写接口的set实例化创建方法
public void setOnHideKeyboardListener(OnHideKeyboardListener onHideKeyboardListener){
this.onHideKeyboardListener = onHideKeyboardListener;
}
4.在父Activity重写dispatchTouchEvent方法即可
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View view = getCurrentFocus();
if (isShouldHideInput(view, ev)) {
InputMethodManager Object = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (Object != null) {
Object.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}
return super.dispatchTouchEvent(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;
}
二.实现对按钮添加点击事件隐藏键盘
代码:
private void closeKeyboard() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// 得到InputMethodManager的实例
if (imm.isActive()) {
// 如果开启
Log.e(TAG, "closeKeyboard: "+imm.isActive());
imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
InputMethodManager.HIDE_NOT_ALWAYS);
// 关闭软键盘,开启方法相同,这个方法是切换开启与关闭状态的
}
}