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

关于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>



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值