点击空白出隐藏键盘,或者点击按钮隐藏软键盘

来源:互联网 发布:淘宝的限时秒杀在哪里 编辑:程序博客网 时间:2024/05/21 08:52
很多时候,我们在使用应用时,会出现输入法软键盘弹出的问题,通常情况下,我们默认会使用户点击返回键或者下一步对软键盘进行隐藏。为了更好的体验,我们可以实现当用户使用完毕软键盘时。点击空白区域即可实现隐藏的功能。效果如图所示:




不多说了看代码吧:

import android.content.Context;import android.os.Bundle;import android.os.IBinder;import android.support.v7.app.AppCompatActivity;import android.view.MotionEvent;import android.view.View;import android.view.inputmethod.InputMethodManager;import android.widget.EditText; /** * Created by J!nl!n on 15/5/21. */public abstract class BaseActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        iniView();    }     public abstract void iniView();     @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        if (ev.getAction() == MotionEvent.ACTION_DOWN) {            View v = getCurrentFocus();            if (isShouldHideKeyboard(v, ev)) {                hideKeyboard(v.getWindowToken());            }        }        return super.dispatchTouchEvent(ev);    }     /**     * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏     *     * @param v     * @param event     * @return     */    private boolean isShouldHideKeyboard(View v, MotionEvent event) {        if (v != null && (v instanceof EditText)) {            int[] l = {0, 0};            v.getLocationInWindow(l);            int left = l[0],                top = l[1],                bottom = top + v.getHeight(),                right = left + v.getWidth();            if (event.getX() > left && event.getX() < right                    && event.getY() > top && event.getY() < bottom) {                // 点击EditText的事件,忽略它。                return false;            } else {                return true;            }        }        // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点        return false;    }     /**     * 获取InputMethodManager,隐藏软键盘     * @param token     */    private void hideKeyboard(IBinder token) {        if (token != null) {            InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);            im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);        }    }}


当然我们还有更加简单的方法来实现该功能,只需要重写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);    }

使用一个BaseActivity进行一些处理公共操作,其他Activity均继承自该基类Activity即可,则所有界面均可实现点击空白区域,隐藏软键盘。


还有另外一种请款不过情况,在项目中,editText获取焦点后,会自动弹出软键盘,关闭的时候一般需要按返回键或者点击软键盘上的按钮,

即使当前activity已经finish掉,软键盘依然存在,会影响用户的体验。

网上目前有很多很详细的办法,比如点击其他空白区域,软键盘就会消失之类的方法,我们项目中没有要求这个,要求的是只要

不遮挡其他操作,还有当前Activity关闭掉后软键盘消失就行,

今天给大家分享两个办法:

//此方法,如果显示则隐藏,如果隐藏则显示private void hintKbOne() {InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);    // 得到InputMethodManager的实例if (imm.isActive()) { // 如果开启imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,InputMethodManager.HIDE_NOT_ALWAYS);             }}

//此方法只是关闭软键盘private void hintKbTwo() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);             if(imm.isActive()&&getCurrentFocus()!=null){    if (getCurrentFocus().getWindowToken()!=null) {    imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);    }              }}




0 0
原创粉丝点击