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

2023-11-03

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

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

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

     /**
     * 重写事件分发
     */
   @Override
   public  boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if (isShouldHideKeyboard(v, ev)) {
               v.clearFocus();//清除Edittext的焦点从而让光标消失
               hideKeyboard(v.getWindowToken()); 
            }
        }
        return super.dispatchTouchEvent(ev);
   }
 
   /**
     * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏
     * @param v
     * @param event
     * @return
     */
   private boolean isShouldHideKeyboard(View v, MotionEvent event) {
        if (v !=null && (vinstanceof EditText)) {
            int[] l = {0, 0};
            v.getLocationOnScreen(l);;
            int left = l[0],
                top = l[1],
                bottom = top + v.getHeight(),
                right = left + v.getWidth();
            if (event.getRawX() > left &&event.getRawX() < right
                    && event.getRawY()> top && event.getRawY() < bottom) {
                //点击EditText的时候不做隐藏处理
                return false;
            } else {
                return true;
            }
        }
        //如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
        return false;
   }
 
   /**
     * 获取InputMethodManager,隐藏软键盘
     * @param token
     */
   private void hideKeyboard(IBindertoken) {
        if (token !=null) {
        //若token不为空则获取输入法管理器使其隐藏输入法键盘
            InputMethodManager im =(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            im.hideSoftInputFromWindow(token,InputMethodManager.HIDE_NOT_ALWAYS);
        }
    }
 
2.上面代码实现后然而只能做到隐藏键盘,但是EditText的光标仍然未消去,原因并不是clearFocus()无效,而是虽然调用了clearFocus()方法,但是由于失去焦点后系统会重新获取焦点,此时焦点又重新给到了EditText,所以光标看上去就是没有消去,所以我们需要让一个在EditText之前的控件去抢焦点,这样子就不会出现上述问题。此处可以直接在layout中的根布局加入焦点属性说明:android:focusableInTouchMode="true"

 

例子:

<RelativeLayout     xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusableInTouchMode="true"
    android:background="@android:color/white"
   >
    <EditText
          android:id="@+id/ed"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:inputType="text"
      />
</RelativeLayout>
 

 

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

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

例子:

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

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

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

ed.setOnEditorActionListener(new OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if(actionId == EditorInfo.IME_ACTION_SEARCH){ //actiondId 即我们设置的imeOptions对应的id  
               ed.clearFocus();
              InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              im.hideSoftInputFromWindow(v.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
                    return true;
                }
                return false;
            }
        });
2.同样的clearFocus()可能无法正常去除光标,做法参照上面,在根布局中去抢焦点。
————————————————
版权声明:本文为CSDN博主「赤色荆棘」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35658173/article/details/78653004

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓隐藏输入法键盘以及去除光标方法 的相关文章

  • 如何从android ble扫描结果中获取CRC?

    我每次都从 ble 设备收到 62 字节的扫描结果 使用下面的回调代码获取扫描结果 我可以获取 RSSI 但无法获取 CRC 或者 获取一帧的CRC的逻辑是什么 来自 ble 设备的数据格式 如数据包标头 广告数据 CRC RSSI 如何从
  • 使用DBFlow,如何加密已经存在的数据库?

    我正在使用 DBFlow 来处理项目中的数据库 并且我想对现有数据库进行加密 我知道我可能必须删除现有的未加密数据库并创建另一个加密数据库 我也知道我可以将 SQLCipher 与 DBFlow 一起使用 如上所述文档 https gith
  • Xamarin 分步向导 Android 视图

    我想在 Xamarin c 中构建一个 android 活动 用于逐步注册和 或信息 我怎样才能做这样的事情 谁能给我一个代码示例或其他东西 谢谢 基本上你需要使用一个名为 a 的元素ViewPager 并且每个页面都会不同Fragment
  • 使用 proguard 混淆文件名

    我正在使用 proguard 和 Android Studio 混淆我的 apk 当我反编译我的apk时 我可以看到很多文件 例如aaa java aab java ETC 但我项目中的所有文件都有原始名称 有没有办法混淆我的项目的文件名
  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 当我单击“完成”键时,Android OnEditorActionListener() actionId 给出 0

    我创建了一个键盘 当用户输入数字时 它会输入特定的 EditText 但是当用户单击Done关键 它没有去setOnEditorActionListener但它关闭了键盘 这是我的代码 final EditText txtQty new E
  • 如何使用 RecyclerView 创建此布局?

    我正在尝试使用这种类型的布局创建回收器视图 这些项目是字符串 可以以不同的大小出现 我不知道每行中有多少项目 我可以使用 StaggeredGridLayoutManager 来做到这一点吗 该图像只是一个假示例 每行可以有更多项目 您可能
  • 使用 DataBinding 测试片段时膨胀类 Fragment 时出错

    有人可以帮我解决这个问题吗 在我的测试中 我想检查登录按钮是否显示在起始页上 今天我已经为这个错误苦苦挣扎了一段时间 我不知道应该如何解决它 我在这里错过了什么 也许这个问题与这个问题有些相似 Espresso 测试失败 并显示 java
  • Toast 消息消失后​​完成活动吗?

    有谁知道 是否有可能对 Toast 消息执行某些操作 在我的情况下完成活动 将被关闭 您只需创建一个Thread持续时间只要Toast显示 然后您就可以完成您的Activity public void onCreate Bundle sav
  • 如何在android中的谷歌地图上聚焦标记

    我只是想知道我们是否可以关注 Android 应用程序中添加的标记 如果是 怎么办 或者有没有其他方法可以完成这项任务 可以说我使用下面的代码添加了一个标记 map addMarker new MarkerOptions title tit
  • 如何在 60 分钟后删除共享首选项

    我想存储登录数据 但希望在 60 分钟后删除该数据 执行此操作的正确方法是什么 在这 60 分钟内可以关闭 停止 打开应用程序 我不想使用内部数据库 这是我的访问代码SharedPreferences sharedpreferences g
  • 模拟器无法加载

    我正在使用 hello android 教程并通过 eclipse 创建 avd 启动模拟器时不使用图像 它只是显示一个黑色的后屏 中间有 ANDROID 字样 并且在 ANDROID 字样的末尾有一个闪烁的光标 我已按照 T 的步骤安装
  • 如何在同一设备上运行的 Android 应用程序之间传输文件?

    我正在编写一个与 RESTful 服务交互的 Android 应用程序 该 Web 服务本质上是一个文件系统 并提供元数据以及对文件的 CRUD 访问 我的应用程序检索元数据 并通过ContentProvider 我需要添加与我的应用程序在
  • Android 操作项上的通知徽章

    我想在操作栏中放置的购物车图像上添加一个通知徽章 并以编程方式操作它 有帮助吗 您可以显示自定义MenuItem on ActionBar通过创建一个custom layout for MenuItem 要设置自定义布局 您必须使用菜单项属
  • 如何将 JSON 数据从 Android 发送到 php url?

    我想将登录信息从我的应用程序发送到 php url 因为这我的应用程序将崩溃 任何人都可以帮助我解决这个问题 这是我的服务器登录方法 我想将数据发送到此登录方法 Method public method login Parameters 3
  • Expresso 的 Android 测试首选项片段

    我在通过 Expresso 测试我的代码时遇到问题 我写了这段代码 public class SettingsActivity extends Activity Override protected void onCreate Bundle
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 通过 Gradle 和 Android Studio 构建和运行应用程序比通过 Eclipse 慢

    我有一个多项目 10 个模块 每次构建大约需要 20 30 秒 当我在 Android Studio 中按 运行 时 每次都必须等待才能重建应用程序 这非常慢 是否可以在 Android Studio 中自动化构建过程 或者您对如何加快此过
  • Android 从通知刷新 Activity

    我有一个程序 我在其中调用通知 如果您将其下拉 该通知将启动一个新活动 mNotificationManager NotificationManager getSystemService ns int icon R drawable sta

随机推荐

  • 软件测试基础理论详解

    1 软件测试定义 软件测试 Software Testing 在规定的条件下对程序进行操作 以发现程序错误 衡量软件质量 并对其是否能满足设计要求进行评估的过程 2 软件测试工程师的素质 良好的沟通和表达能力 具有怀疑与破坏的精神 扎实的软
  • Unity实现异步加载场景

    一 创建UGUI 首先我们在LoginCanvas登入面板下面创建一个Panel 取名为LoadScreen 再在loadScreen下面创建一个Image组件 放置背景图片 然后我们再在lpadScreen下面继续创建一个Slider 这
  • jdbc C3P0容错和自动重连

    1 C3P0容错和自动重连与以下配置参数有关 breakAfterAcquireFailure true表示pool向数据库请求连接失败后标记整个pool为block并close 就算后端数据库恢复正常也不进行重连 客户端对pool的请求都
  • CentOS8基础篇14:使用源代码安装FTP软件

    一 TAR包管理工具简介 TAR Tape Archive TAR 是Linux下的包管理工具 利用tar命令可以将要备份保存的数据打包成一个扩展名为 tar的文件 以便文件的保存 需要使用时再利用tar命名进行释放即可 使用tar命令对文
  • Java面向对象编程

    下面有关JVM内存 说法错误的是 A 程序计数器是一个比较小的内存区域 用于指示当前线程所执行的字节码执行到了第几行 是线程隔离的 B Java方法执行内存模型 用于存储局部变量 操作数栈 动态链接 方法出口等信息 是线程隔离的 C 方法区
  • 自己组装电脑配置清单2022 自己组装电脑需要哪些配件

    自己组装电脑需要主板 CPU处理器 CPU散热器 内存条 显卡 硬盘 鼠标 键盘 声卡 耳机 音箱 机箱 显示器 电源等等 组装电脑怎么搭配更合适这些点很重要 http www adiannao cn du 3500左右性价比游戏型组装电脑
  • 【RPA】机器人流程自动化(RPA)概念、原理与实践

    多数人每天都会使用到一些机器人流程自动化工具 例如读取邮件和系统 计算 生成文件和报告 而在未来 那些你不想做的枯燥的工作 也许真的可以不做了 重复化 标准化的工作都可以让机器人帮你完成 本期推文特邀陈剑独家原创阐述RPA的概念 原理与实践
  • Kubernetes 的控制器模型

    文章目录 控制器模式 控制循环 控制器的配置和定义 Deployment 控制器详解 水平扩展 收缩 滚动更新 版本控制 控制器模式 本篇文章我们来看看 编排 这个 Kubernetes 项目最核心的功能吧 经过上篇文章的介绍后 你可能已经
  • redis主从-哨兵模式(windows下搭建)

    一 下载 由于redis官方并不支持windows操作系统 所以官网上是下不到的 需要到gitlab上下载 下载地址如下 https github com MicrosoftArchive redis releases 二 解压安装 将下载
  • webpack4---模块化打包工具(一)

    一 webpack4初识 1 首先先了解几个规范 ES规范 导出 export default Header 导入 import Header from header js CommonJS规范 导出 module exports Head
  • 如何快速安装和配置Node.js环境

    Node js是一种可以简化Web应用程序开发的平台 它使用JavaScript编写 并使用Chrome V8 JavaScript引擎 本文将介绍如何快速安装和配置Node js环境 为读者打开了Node js的大门 并提供了背景信息 一
  • 有趣的数据结构算法11——实现中缀表达式到后缀表达式的转换

    有趣的数据结构算法11 实现中缀表达式到后缀表达式的转换 解题思路 实现代码 GITHUB下载连接 这是学习栈的最后一篇blog了 在上一篇博客里 讲述了如何利用栈计算后缀表达式的结果 但是谁会无缘无故用后缀表达式写一个式子在那里计算呢 这
  • Quartz 之 JobExecutionContext 解读

    项目地址 https github com yuleiqq quartz example tree master quartz study 查看源码注释可以得知 JobExecutionContext 是一个包含了各种上下文信息的句柄 指向
  • 软件工程-分离原理

    分离原理是建立企业管理信息系统分析方法体系的基础分离原理与组合原理的关系定义分离原理 将研究对象中符合相同设计方法的同类项进行分离 归集 这种分离方式为在软件工程中建立具有普遍意义的分析与设计模型奠定了基础 作用将企业的运行体系进行拆分 在
  • [QT编程系列-13]:QT快速学习 - 1- 初识

    目录 第1章 QT的介绍 1 1 QT VS MFC 1 2 QT历史 1 3 QT的应用 1 4 QT学习方法 1 5 QT对象树 1 6 2 8定律 1 7 QT优势 1 8 QT支持的平台 第2章 QT UI是各种控件对象的堆积 第3
  • 【2021版本】软件测试的分类

    按测试阶段分类 单元测试 对软件中最小可充实单元进行检查和验证 单元测试的原则 尽可能保证各个测试用例是相互独立的 一般由代码的开发人员来实施 用以检验所开发的代码功能符合自己的设计要求 单元测试的益处 能尽早发现缺陷 有利于重构 简化集成
  • 决策树的典型案例

    小王是一家著名高尔夫俱乐部的经理 但是他被雇员数量问题搞得心情十分不好 某些天好像所有人都來玩高尔夫 以至于所有员工都忙的团团转还是应付不过来 而有些天不知道什么原因却一个人也不来 俱乐部为雇员数量浪费了不少资金 小王的目的是通过下周天气预
  • CentOS7 升级Python2.x到3.x

    CentOS 7 中默认安装了 Python 版本比较低 2 7 5 为了使用新版 3 x 需要对旧版本进行升级 由于很多基本的命令 软件包都依赖旧版本 比如 yum 所以 在更新 Python 时 建议不要删除旧版本 新旧版本可以共存 一
  • 临时标识--免登陆uuid

    一 什么是临时标识 就是一个字符串 可以让用户查看购物车等需要注册登录的信息 通常用uuid就可以创建这个字符串 临时标识 在请求拦截器中加 存储在vuex中的state userTempId 二 正式开始 1 下载创建uuid 并且生成用
  • 安卓隐藏输入法键盘以及去除光标方法

    在开发中遇到一个需求 点击屏幕非编辑区以及点击键盘回车键后要隐藏输入法以及光标要关闭 因此向各位分享一下做法 一 点击屏幕处于非edittext时让键盘消失以及清除edittext光标方法 1 在Activity中使用如下代码 重写事件分发