点击空白区域,隐藏软键盘

时间:2022-08-23 23:39:58

很多时候,我们在使用应用时,会出现输入法软键盘弹出的问题,通常情况下,我们默认会使用户点击返回键或者下一步对软键盘进行隐藏。为了更好的体验,我们可以实现当用户使用完毕软键盘时。点击空白区域即可实现隐藏的功能。效果如图所示:
点击空白区域,隐藏软键盘


代码实现

代码块语法遵循标准markdown代码,例如:

?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 <code
class="language-java"
hljs=
"">package
example.com.jinlin.myapplication;
 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);        }    }}</code>

当然我们还有更加简单的方法来实现该功能,只需要重写onTouchEvent方法即可。代码如下:

?
1234567891011 <code
class="hljs"
java=
"">// 点击空白区域 自动隐藏软键盘
    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);
    }</code>

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