安卓隐藏输入法键盘以及去除光标方法

本文介绍在安卓开发中如何通过代码实现点击屏幕非编辑区及键盘回车键后隐藏输入法并关闭光标的功能。包括重写触摸事件、使用clearFocus方法以及通过根布局抢夺焦点的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发中遇到一个需求“点击屏幕非编辑区以及点击键盘回车键后要隐藏输入法以及光标要关闭”,因此向各位分享一下做法

一.点击屏幕处于非edittext时让键盘消失以及清除edittext光标方法:

         1.在Activity中使用如下代码:

  1.      /**
  2.      * 重写事件分发
  3.      */
  4.    @Override
  5.    public  boolean dispatchTouchEvent(MotionEvent ev) {
  6.         if (ev.getAction() == MotionEvent.ACTION_DOWN) {
  7.             View v = getCurrentFocus();
  8.             if (isShouldHideKeyboard(v, ev)) {
  9.                v.clearFocus();//清除Edittext的焦点从而让光标消失
  10.                hideKeyboard(v.getWindowToken()); 
  11.             }
  12.         }
  13.         return super.dispatchTouchEvent(ev);
  14.    }
  15.  
  16.    /**
  17.      * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏
  18.      * @param v
  19.      * @param event
  20.      * @return
  21.      */
  22.    private boolean isShouldHideKeyboard(View v, MotionEvent event) {
  23.         if (v !=null && (vinstanceof EditText)) {
  24.             int[] l = {0, 0};
  25.             v.getLocationOnScreen(l);;
  26.             int left = l[0],
  27.                 top = l[1],
  28.                 bottom = top + v.getHeight(),
  29.                 right = left + v.getWidth();
  30.             if (event.getRawX() > left &&event.getRawX() < right
  31.                     && event.getRawY()> top && event.getRawY() < bottom) {
  32.                 //点击EditText的时候不做隐藏处理
  33.                 return false;
  34.             } else {
  35.                 return true;
  36.             }
  37.         }
  38.         //如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
  39.         return false;
  40.    }
  41.  
  42.    /**
  43.      * 获取InputMethodManager,隐藏软键盘
  44.      * @param token
  45.      */
  46.    private void hideKeyboard(IBindertoken) {
  47.         if (token !=null) {
  48.         //若token不为空则获取输入法管理器使其隐藏输入法键盘
  49.             InputMethodManager im =(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  50.             im.hideSoftInputFromWindow(token,InputMethodManager.HIDE_NOT_ALWAYS);
  51.         }
  52.     }
  53.  

2.上面代码实现后然而只能做到隐藏键盘,但是EditText的光标仍然未消去,原因并不是clearFocus()无效,而是虽然调用了clearFocus()方法,但是由于失去焦点后系统会重新获取焦点,此时焦点又重新给到了EditText,所以光标看上去就是没有消去,所以我们需要让一个在EditText之前的控件去抢焦点,这样子就不会出现上述问题。此处可以直接在layout中的根布局加入焦点属性说明:android:focusableInTouchMode="true"

 

例子:

  1. <RelativeLayout     xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:focusableInTouchMode="true"
  6.     android:background="@android:color/white"
  7.    >
  8.     <EditText
  9.           android:id="@+id/ed"
  10.           android:layout_width="match_parent"
  11.           android:layout_height="wrap_content"
  12.           android:inputType="text"
  13.       />
  14. </RelativeLayout>

 

 

二.当输入完成后点击回车键后让键盘和光标消失方法

1.当我们用输入法中的回车时可以使用EditText中的setOnKeyListener接口回调对相应按键事件进行处理:

例子:

  1. ed.setOnKeyListener(newOnKeyListener() {
  2.         @Override
  3.     public boolean onKey(View v, int keyCode,KeyEvent event) {
  4.                 // TODO Auto-generated methodstub
  5.                 //若接收到回车键时候失去焦点,隐藏输入法
  6.             if (keyCode == KeyEvent.KEYCODE_ENTER){
  7.                       ed.clearFocus();
  8.                       InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
  9.                       im.hideSoftInputFromWindow(v.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
  10.                       return true;
  11.                 }
  12.                 return false;
  13.             }
  14.         });

 

注意:若设置了EdittextimeOptions属性为非normal(即非默认)的情况下,此时可能收不到相应的回调因此无法执行此处方法

 ////补充----若定义为别的imeOptions则需要使用OnEditorActionListener

  1. ed.setOnEditorActionListener(new OnEditorActionListener() {
  2.             @Override
  3.             public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
  4.                 if(actionId == EditorInfo.IME_ACTION_SEARCH){ //actiondId 即我们设置的imeOptions对应的id  
  5.                ed.clearFocus();
  6.               InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
  7.               im.hideSoftInputFromWindow(v.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
  8.                     return true;
  9.                 }
  10.                 return false;
  11.             }
  12.         });

2.同样的clearFocus()可能无法正常去除光标,做法参照上面,在根布局中去抢焦点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值