Android点击其他任意位置收起软键盘

  在Android应用开发中,经常出现这样的需求,用户在输入文字的过程中,可能不想继续输入了,通过滑动或者点击其他位置(除软键盘和EditText以外的任何位置),希望能够自动收回键盘,这个功能可能有些rom会自己实现了,但是大部分还是没有自己实现这个功能的,那么如果我们要自己实现,要如何解决呢?

  首先,我们当然要先拦截其他任何的用户触摸屏幕的事件,通过重写Activity的boolean dispatchTouchEvent(MotionEvent ev);可是实现拦截用户的触摸事件。代码如下:

1     @Override
2     public boolean dispatchTouchEvent(MotionEvent ev) {
3         DisplayUtils.hideInputWhenTouchOtherView(this, ev, getExcludeTouchHideInputViews());
4         return super.dispatchTouchEvent(ev);
5     }

DisplayUtils.hideInputWhenTouchOtherView方法就是我们自己实现的当必要时候隐藏软键盘的代码了。关于hideInputWhenTouchOtherView的方法实现如下:

 1    /**
 2      * 当点击其他View时隐藏软键盘
 3      * @param activity
 4      * @param ev
 5      * @param excludeViews  点击这些View不会触发隐藏软键盘动作
 6      */
 7     public static final void hideInputWhenTouchOtherView(Activity activity, MotionEvent ev, List<View> excludeViews){
 8
 9
10         if (ev.getAction() == MotionEvent.ACTION_DOWN){
11             if (excludeViews != null && !excludeViews.isEmpty()){
12                 for (int i = 0; i < excludeViews.size(); i++){
13                     if (isTouchView(excludeViews.get(i), ev)){
14                         return;
15                     }
16                 }
17             }
18             View v = activity.getCurrentFocus();
19             if (DisplayUtils.isShouldHideInput(v, ev)){
20                 InputMethodManager inputMethodManager = (InputMethodManager)
21                         activity.getSystemService(Context.INPUT_METHOD_SERVICE);
22                 if (inputMethodManager != null){
23                     inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
24                 }
25             }
26
27         }
28     }

方法参数中的excludeViews表示点击这么View不会去试图隐藏软键盘,因为有些View的触摸事件我们有时候并不希望去隐藏软键盘,比如EditText的背景布局,聊天输入框的发送按钮等(如果摸一下发送按钮,键盘就收回去了岂不是很蛋疼)

  可以看到,整个方法方法的实现过程就是通过判断触摸位置是属于哪个View,如果是需要排除的View,就直接不处理了.如果判断出来是点击了其他任意非EditText的View,就会隐藏软键盘。其他两个判断函数如下:

 1     public static final boolean isTouchView(View view, MotionEvent event){
 2         if (view == null || event == null){
 3             return false;
 4         }
 5         int[] leftTop = {0, 0};
 6         view.getLocationInWindow(leftTop);
 7         int left = leftTop[0];
 8         int top = leftTop[1];
 9         int bottom = top + view.getHeight();
10         int right = left + view.getWidth();
11         if (event.getRawX() > left && event.getRawX() < right
12                 && event.getRawY() > top && event.getRawY() < bottom){
13             return true;
14         }
15         return false;
16     }
17
18     public static final boolean isShouldHideInput(View v, MotionEvent event){
19         if (v != null && (v instanceof EditText)){
20             return !isTouchView(v, event);
21         }
22         return false;
23     }

  通过复用hideInputWhenTouchOtherView() 方法(甚至你可以在基类Activity里实现)就可以在任何Activity中以最少代码实现点击其他任意位置收起软键盘的功能了。如果代码有什么需要指正或者有更好的替代方案的,请大家及时告知哈。

时间: 2024-12-25 17:57:33

Android点击其他任意位置收起软键盘的相关文章

Android 设置系统的返回键 和软键盘获取焦点问题

很多朋友出现过这样的一个问题,当底部弹出评论框时,有几个问题,一个是软件盘弹出时怎么让焦点在输入框,关于这个问题,本人也是遇到过,解决了很久,有的是在布局设置或者代码里setFocusable(true),并没有用,又在代码或者代码里设置requestFocus(),依然没有用,其实这个解决办法是没有错的,但是为什么会没用呢,因为并没有及时是在软件盘弹出时设置,所以先提出隐藏和显示软件盘的方法 private void onFocusChange(boolean hasFocus) { fina

android EditText自动弹出和自动关闭软键盘

程序进入某个activity直接弹出软键盘,不能直接在OnCreate中设置,必须等View绘制事件完毕才可以弹出,需要用到Timer辅助实现,如果要实现输入的功能,必须让EditText获得焦点. //应用启动后自动打开输入法 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Timer ti

点击屏幕其他地方让软键盘消失

/* 在获取不到焦点的时候隐藏软键盘 */ @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub if (event.getAction() == MotionEvent.ACTION_DOWN) { if (getCurrentFocus() != null && getCurrentFocus().getWindowToken() != null) {

C# 点击窗口任意位置拖动

代码: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Runtime.InteropServices; 8 using System.Text; 9 using System.Threading.Tasks; 10 u

Android专治各种Picker弹出软键盘

mDatePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS);mTimePicker.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);mNumberPicke.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

点击键盘外,让软键盘消失

这个操作还是很有必要滴,,笔记也是得做滴 @Override public boolean onTouchEvent(MotionEvent event) { InputMethodManager manager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); // TODO Auto-generated method stub if(event.getAction() == MotionEvent.AC

h5 ios微信浏览器 input获取焦点后,收起软键盘,光标错位

整个页面布局如下: 外层设置fixed的原因是不让页面在浏览器中进行上下拖拽, 最后形成的结果是:输入框获取焦点输入内容后,光标错位,导致不能选中输入框重新获取焦点(页面上移,但是布局未产生影响); 解决 改变页面布局: 外层fixed取消,改用 display:flex布局,将内容分为3部分,中间内容flex-grow: 1; 好了 给input设置fixed或者input的父元素设置fixed 导致此原因 原文地址:https://www.cnblogs.com/bigsister/p/10

【转】Android点击空白区域,隐藏输入法软键盘

原文网址:http://www.2cto.com/kf/201505/401382.html 很多时候,我们在使用应用时,会出现输入法软键盘弹出的问题,通常情况下,我们默认会使用户点击返回键或者下一步对软键盘进行隐藏.为了更好的体验,我们可以实现当用户使用完毕软键盘时.点击空白区域即可实现隐藏的功能.效果如图所示: 代码实现 代码块语法遵循标准markdown代码,例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Android点击空白区域,隐藏输入法软键盘

欢迎使用Markdown编辑器写博客 很多时候,我们在使用应用时,会出现输入法软键盘弹出的问题,通常情况下,我们默认会使用户点击返回键或者下一步对软键盘进行隐藏.为了更好的体验,我们可以实现当用户使用完毕软键盘时.点击空白区域即可实现隐藏的功能.效果如图所示: 代码实现 代码块语法遵循标准markdown代码,例如: package example.com.jinlin.myapplication; import android.content.Context; import android.o