关于activity和fragment中点击edittext之外的空白区域使软键盘消失的解决办法

大家都知道的使软键盘消失的方法很简单 如下
<span style="font-size:24px;">InputMethodManager imm = (InputMethodManager) getSystemService(
    INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);</span>


当然我知道你想要的是点击空白地方使输入框消失代码如下

可以在activity中重写onTouchEvent

// 点击空白区域 自动隐藏软键盘
    public boolean onTouchEvent(MotionEvent event) {
        if(null != this.getCurrentFocus()){
            /**
             * 点击空白位置 隐藏软键盘
             */
            InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
            return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
        }
        return super .onTouchEvent(event);
    }


在fragment中由于没有onTouchEvent重写所以可以在onCreateView中,对view使用以下方法

 view.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                 InputMethodManager manager = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                 if(event.getAction() == MotionEvent.ACTION_DOWN){  
                     if(getActivity().getCurrentFocus()!=null && getActivity().getCurrentFocus().getWindowToken()!=null){  
                       manager.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);  
                     }  
                  }  
                return false;
            }
        });
或者在activity中重写onTouchEvent然后在fragment中调用如下方法

view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                getActivity().onTouchEvent(event);
                return false;
            }
        });



上面的问题都不大,但是当你的activity或者fragment中包含scrollview的时候,你会发现你的onTouchEvent()根本不会得到调用,这个时候你就慌了,接着你会去想方法设法的实现touch,click,focus监听,然而你会发现然并卵,你就会去思考,能不能重写scrollview来拦截touch事件,然而你会发现仍然是然并卵,那么到底如何解决呢?

步骤如下

1一个公共的方法 用来隐藏软键盘

public static void hideSoftKeyboard(Activity activity) {
    InputMethodManager inputMethodManager = 
        (InputMethodManager) activity.getSystemService(
            Activity.INPUT_METHOD_SERVICE);
    inputMethodManager.hideSoftInputFromWindow(
        activity.getCurrentFocus().getWindowToken(), 0);
}
2,在BaseActivity中或者BaseFragment中这样来调用,当然这里你要区分获得当前使用的是哪个activity或者哪个fragment(如何确定当前是哪个fragment这个可以定义接口来回调就好)---当然你也可以在你需要的activity或fragment中直接调用这种方式不推荐
public void setupUI(View view) {

    // Set up touch listener for non-text box views to hide keyboard.
    if (!(view instanceof EditText)) {
        view.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                hideSoftKeyboard(MyActivity.this);
                return false;
            }
        });
    }

    //If a layout container, iterate over children and seed recursion.
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            View innerView = ((ViewGroup) view).getChildAt(i);
            setupUI(innerView);
        }
    }
}
注意:在fragment中你可以直接将onCreateView中的view传递到setupUI的参数当中

对于为什么包含scrollview的activity和fragment会不调用onTouch事件,后续会在研究过scrollview源码之后在此博客内容下补充,当然也欢迎大神来帮忙解答,么么哒~.~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值