Android点击EditText文本框之外任何地方隐藏键盘的解决办法

1,实现方法一:

通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/traceroute_rootview"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="@color/white"
  android:clickable="true"
  android:gravity="center_horizontal"
  android:orientation="vertical" >
</LinearLayout> 

加上id和clickable=true

然后在onCreate里,添加onClick事件的监听:

findViewById(R.id.traceroute_rootview).setOnClickListener(this); 

在onClick中:

@Override
public void onClick(View v) {
  switch (v.getId()) {
  case R.id.traceroute_rootview:
     InputMethodManager imm = (InputMethodManager)
     getSystemService(Context.INPUT_METHOD_SERVICE);
     imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    break;
  }
}

这样就可以完美的解决了输入框外的隐藏效果,对于布局不是特别复杂或是其它触摸事件少的情况下可以使用。

2,实现思路二:

通过dispatchTouchEvent每次ACTION_DOWN事件中动态判断非EditText本身区域的点击事件,然后在事件中进行屏蔽。

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
  if (ev.getAction() == MotionEvent.ACTION_DOWN) {
    View v = getCurrentFocus();
    if (isShouldHideInput(v, ev)) { 

      InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
      if (imm != null) {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
      }
    }
    return super.dispatchTouchEvent(ev);
  }
  // 必不可少,否则所有的组件都不会有TouchEvent了
  if (getWindow().superDispatchTouchEvent(ev)) {
    return true;
  }
  return onTouchEvent(ev);
} 

isShoudHideInput(View v,MotionEvent e)方法:

public boolean isShouldHideInput(View v, MotionEvent event) {
  if (v != null && (v instanceof EditText)) {
    int[] leftTop = { 0, 0 };
    //获取输入框当前的location位置
    v.getLocationInWindow(leftTop);
    int left = leftTop[0];
    int top = leftTop[1];
    int bottom = top + v.getHeight();
    int 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;
} 

这种方法实现起来比较麻烦,解决思路与iOS中的事件分发机制是类似,对于处理隐藏事件比较清晰,通过层层事件分发,然后判断是否在需要屏蔽的区域。

1,实现方法一:

通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/traceroute_rootview"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:background="@color/white"
  android:clickable="true"
  android:gravity="center_horizontal"
  android:orientation="vertical" >
</LinearLayout> 

加上id和clickable=true

然后在onCreate里,添加onClick事件的监听:

findViewById(R.id.traceroute_rootview).setOnClickListener(this); 

在onClick中:

@Override
public void onClick(View v) {
  switch (v.getId()) {
  case R.id.traceroute_rootview:
     InputMethodManager imm = (InputMethodManager)
     getSystemService(Context.INPUT_METHOD_SERVICE);
     imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    break;
  }
}

这样就可以完美的解决了输入框外的隐藏效果,对于布局不是特别复杂或是其它触摸事件少的情况下可以使用。

2,实现思路二:

通过dispatchTouchEvent每次ACTION_DOWN事件中动态判断非EditText本身区域的点击事件,然后在事件中进行屏蔽。

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
  if (ev.getAction() == MotionEvent.ACTION_DOWN) {
    View v = getCurrentFocus();
    if (isShouldHideInput(v, ev)) {
      InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
      if (imm != null) {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
      }
    }
    return super.dispatchTouchEvent(ev);
  }
  // 必不可少,否则所有的组件都不会有TouchEvent了
  if (getWindow().superDispatchTouchEvent(ev)) {
    return true;
  }
  return onTouchEvent(ev);
} 

isShoudHideInput(View v,MotionEvent e)方法:

public boolean isShouldHideInput(View v, MotionEvent event) {
  if (v != null && (v instanceof EditText)) {
    int[] leftTop = { 0, 0 };
    //获取输入框当前的location位置
    v.getLocationInWindow(leftTop);
    int left = leftTop[0];
    int top = leftTop[1];
    int bottom = top + v.getHeight();
    int 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;
} 

这种方法实现起来比较麻烦,解决思路与iOS中的事件分发机制是类似,对于处理隐藏事件比较清晰,通过层层事件分发,然后判断是否在需要屏蔽的区域。

以上所述是小编给大家介绍的Android点击EditText文本框之外任何地方隐藏键盘的解决办法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android中实现EditText密码显示隐藏的方法

    在Google发布了support:design:23+以后我们发现有这么一个东西TextInputLayout,先看下效果图: <android.support.design.widget.TextInputLayout android:id="@+id/pwdLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:passw

  • Android中自定义的dialog中的EditText无法弹出输入法解决方案

    1.解决无法弹出输入法: 在show()方法调用之前,用dialog.setView(new EditText(context))添加一个空的EditText,由于是自定义的AlertDialog,有我们指定的布局,所以设置这个不会影响我们的功能,这样就可以弹出输入法了-- 2.可以弹出输入法了,但了为了增强用户体验性,当dialog中含有editText时应该,在显示dialog的同时自动弹出键盘: (1) 可以在自定义的dialog中增加如下方法: public void showKeybo

  • Android中EditText屏蔽第三方输入法表情的方法示例

    前言 众所周知如果用第三方的输入法的表情会给开发带来一定的麻烦,一般地像服务器上传的字符都是普通的字符,但是测试,就是狠狠得拿出搜狗输入法,点几个表情,那么问题就来了,要么是显示异常,要么是直接crash,但是有很少的部分机型,会支持,可能是第三方的ROM对Android 的TextView 做了一定的处理,所以,我们只能干掉该死的表情了. 具体的方法如下: 首先是在EditTextView 里面加入TextWatcher 在判断字符的变化时,就判断字符的类型,是否为字符,否则删除原来的字符,重

  • Android取消EditText自动获取默认焦点

    最近在通讯录新建联系人=中,一进入一个页面, EditText默认就会自动获取焦点,很是郁闷, 如何让EditText不自动获取焦点? 那么如何取消这个默认行为呢? 在网上找了好久,有点监听软键盘事件,有点调用clearFouse()方法,但是测试了都没有!xml中也找不到相应的属性可以关闭这个默认行为 解决之道:在EditText的父级控件中找一个,设置成 android:focusable="true" android:focusableInTouchMode="true

  • Android点击EditText文本框之外任何地方隐藏键盘的解决办法

    1,实现方法一: 通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/traceroute_rootview" android:layout_width="fill_parent" android:

  • Android AutoCompleteTextView自动提示文本框实例代码

    自动提示文本框(AutoCompleteTextView)可以加强用户体验,缩短用户的输入时间(百度的搜索框就是这个效果). 先给大家展示下效果图,如果大家感觉还不错,请参考实现代码: 最后一张获取文本框里面的值(其实就跟TextView.EditText一样): 首先,在xml中定义AutoCompleteTextView控件: activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/r

  • android 点击EditText始终不弹出软件键盘实现代码

    android  点击EditText始终不弹出软件键盘 场景描述:正常情况下,当点击EditText时,软键盘会弹出来.现在的要求是当点击EditText时,弹日期选择对话框,选择的结果显示在EditText上.若不处理,当点击EditText时,软键盘和对话框都会弹出,显然用户会感觉到不爽. 解决办法,当点击EditText时: 1.存储当前的输入类型 2.设置输入类型为InputType.TYPE_NULL,禁止手机软键盘 3.还原原来的输入类型,因为这次操作完,还要允许用户修改. 4.弹

  • JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转

    程序要求: 编写一个html文件的网页代码,页面包含一个下拉列表框.一个文本框和一个按钮,下拉列表框选择要去的网站,当选择完毕后文本框中出现对应的网址.点击确认跳转按钮后访问文本框中出现的网址. 实现效果: 实现代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JavaScript事件</title>

  • android  点击EditText始终不弹出软件键盘实现代码

    android  点击EditText始终不弹出软件键盘 场景描述:正常情况下,当点击EditText时,软键盘会弹出来.现在的要求是当点击EditText时,弹日期选择对话框,选择的结果显示在EditText上.若不处理,当点击EditText时,软键盘和对话框都会弹出,显然用户会感觉到不爽. 解决办法,当点击EditText时: 1.存储当前的输入类型 2.设置输入类型为InputType.TYPE_NULL,禁止手机软键盘 3.还原原来的输入类型,因为这次操作完,还要允许用户修改. 4.弹

  • js光标定位文本框回车表单提交问题的解决方法

    本文实例讲述了js光标定位文本框回车表单提交问题的解决方法.分享给大家供大家参考.具体分析如下: 当光标定位在辅助查找的文本框后回车,页面会出现方法的返回的json串. 原因:When there is only one single-line text input field in a form, the user agent should accept Enter in that field as a request to submit the form. 翻译一下:当form中只有一个in

  • Android实现类似IOS右滑返回的效果(原因分析及解决办法)

    使用类库SwipeBackLayout https://github.com/Issacw0ng/SwipeBackLayout 出现的问题: 1. 主Activity返回时黑屏或者返回只是看到桌面背景而没有看到上一个Activity界面 原因: 使用滑动返回需要在Activity的额主题中声明android:windowIsTranslucent=true,而该属性是设置Activity为是否为透明主题,当主Activity采用透明主题时,由于是app Activity栈中的第一个,所以滑动返

  • Android Fragment中使用SurfaceView切换时闪一下黑屏的解决办法

    重构了下之前自己的一个新闻客户端,全部使用了Fragment来进行页面切换,只有一个入口Activity作为程序的启动Activity,其中有一个界面需要调用摄像头识别二维码,于是就会用到SurfaceView进行预览,那么问题来了,当切换到对应的Fragment时,屏幕会黑一下,黑了1秒左右就显示出正常的界面,而且这种现象只有第一次进入该Fragment才会出现,之后进入都不会出现,解决方法是无意在github上看到了,试了一下,可以行的通,下面贴出解决方法. 方法一.在Activity的on

  • Android Gradle Build Error:Some file crunching failed, see logs for details解决办法

    Android Gradle Build Error:Some file crunching failed, see logs for details解决办法 错误日志:Error:java.lang.RuntimeException: Some file crunching failed, see logs for details Log: FAILURE: Build failed with an exception. * What went wrong: Execution failed

  • Android app启动时黑屏或者白屏的原因及解决办法

    1.产生原因 其实显示黑屏或者白屏实属正常,这是因为还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景. 示例: 2.解决办法 通过设置设置Style (1)设置背景图Theme 通过设置一张背景图. 当程序启动时,首先显示这张背景图,避免出现黑屏 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name=&qu

随机推荐