Android开发之点击输入法外部关闭键盘点击输入法外部关闭输入法的解决方法

在此做个笔记,防止遗忘,可能以后有需要。

先看下效果图

 先讲解下思路:

首先在actviity里面获取到当前获取焦点的控件,判断当前控件是不是输入法弹起的那个EditText,然后再Activity的分发事件dispatchTouchEvent方法里面通过拿到点击的坐标位置,然后判断点击的坐标是否是点击的除EditText控件以外的部分就可以了,如果点击的EditText以外的位置则可以直接调用系统关闭键盘的方法即可,看代码吧。

Java版本

/**
 		重写dispatchTouchEvent
     * 点击软键盘外面的区域关闭软键盘
     * @param ev
     * @return
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            // 获得当前得到焦点的View,
            View v = getCurrentFocus();
            if (isShouldHideInput(v, ev)) {
				//根据判断关闭软键盘
                InputMethodManager imm = (InputMethodManager)getSystemService(
                        Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 判断用户点击的区域是否是输入框
     *
     * @param v
     * @param event
     * @return
     */
    private boolean isShouldHideInput(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;
            }
        }
        return false;
    }

Kotlin版本

 override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
        if (ev!!.action == MotionEvent.ACTION_DOWN) {
            val v = currentFocus
            if (isShouldHideKeyboard(v, ev)) {
                //根据判断关闭软键盘
                SoftKeyboardUtils.hideKeyboard(v!!)
            }
        }
        return super.dispatchTouchEvent(ev)
    }

    private fun isShouldHideKeyboard(v: View?, event: MotionEvent): Boolean {
        if (v is EditText) {
            val l = intArrayOf(0, 0)
            v.getLocationOnScreen(l)
            val left = l[0]
            val top = l[1]
            val bottom: Int = top + v.getHeight()
            val right: Int = left + v.getWidth()
            //下面减去100是减去的搜索框右边Button按钮的大小粗略估算的
            return !(event.rawX > left && event.rawX - 100 < right && event.rawY > top && event.rawY < bottom)
        }
        return false
    }

看下上面对应的工具类SoftKeyboardUtils.kt


import android.content.Context
import android.view.View
import android.view.inputmethod.InputMethodManager
import com.common.global.GlobalContext

/**
 * 显示和关闭系统键盘的方法
 * @author xiayiye5
 * @date 2021/9/29 10:45
 */
object SoftKeyboardUtils {
    private val imm: InputMethodManager =
        GlobalContext.get().getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

    /**
     * 关闭系统键盘的方法
     */
    fun hideKeyboard(view: View) {
        imm.hideSoftInputFromWindow(view.windowToken, 0)
    }

    /**
     * 显示系统键盘的方法
     */
    fun showKeyboard(view: View) {
        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
    }
}

非常感谢原博主:原博主直达

猜你喜欢

转载自blog.csdn.net/xiayiye5/article/details/121101294
今日推荐