您的位置:首页 > 移动开发 > Android开发

ScrollView里面的EditText的点击空白处键盘消失的问题

2016-02-01 15:17 363 查看
关于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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Scrollview android 控件