关于EditText的点击空白处键盘消失的问题,我相信大家都知道怎么做。那将EditText嵌套在ScrollView里面,点击空白处键盘消失就会出现一些问题。只有你点击在ScrollView以外的地方才会实现效果,点击在ScrollView里面的地方则不会实现。原因很简单,实现屏幕点击事件的是onTouchEvent事件,而ScrollView本身就有onTouchEvent方法,所以被自身拦截了,所以我们必须重写ScrollView里面的方法。很多人说重写ScrollView里面的onTouchEvent方法,不让他拦截,我也尝试了一下,效果总是不理想,所以我在这里不是让他拦截,而是让他实现键盘消失的方法,一样可以达到想要的效果。
自定义一个ScrollView控件,代码如下:
package com.cssiot.reminders.widget; import android.app.Activity; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.inputmethod.InputMethodManager; import android.widget.ScrollView; /** * 自定义的ScrollView,解决了onTouchEvent冲突的问题 * <p/> * Created by star on 2016/1/6. */ public class OnTouchScrollView extends ScrollView { private float downY = 0; private float upY = 0; private Boolean flag = false; public OnTouchScrollView(Context context) { super(context); } public OnTouchScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public OnTouchScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean onTouchEvent(MotionEvent event) {//这个方法如果 true 则整个Activity 的 onTouchEvent() 不会被系统回调 int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: downY = event.getY(); return true; case MotionEvent.ACTION_UP: upY = event.getY(); //相等为false flag = compareFloat(); if (!flag) { Activity activity = (Activity) getContext(); //收键盘 InputMethodManager manager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); //初始化InputMethodManager类 if (activity.getCurrentFocus() != null && activity.getCurrentFocus().getWindowToken() != null) { manager.hideSoftInputFromWindow(activity.getCurrentFocus() .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } } return super.onTouchEvent(event); } /** * 比较y轴的起始点和终点的差距,判断是否是在同一个点上,允许200的误差 * @return */ private Boolean compareFloat() { //不相等 if (Math.abs(upY - downY) > 200) { return true; } else {//相等 拦截设置false return false; } } }在布局文件里引用这个控件即可,代码如下:
<com.cssiot.reminders.widget.OnTouchScrollView android:id="@+id/scroll" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" android:layout_below="@+id/title_layout" android:layout_above="@+id/commit_btn"> </com.cssiot.reminders.widget.OnTouchScrollView>