如何以编程方式关闭/隐藏 Android 软键盘?

做安卓开发的时候,会有各种各样的想法和疑问,例如:怎么对软键盘关闭或者怎么对软键盘隐藏?震惊

问题

我的布局中有一个EditText和一个Button

在编辑字段中写入并单击 后Button,我想在触摸键盘外部时隐藏虚拟键盘。我认为这是一段简单的代码,但是在哪里可以找到它的示例?

解决方法

为了澄清这种疯狂行为,我首先代表所有 Android 用户对 Google 对软键盘的彻底荒谬的处理表示歉意。对于同一个简单的问题,之所以有这么多不同的答案,是因为这个 API 和 Android 中的许多其他 API 一样,设计得很糟糕。我想不出有什么礼貌的方式来表达它。

我想隐藏键盘。我期望向Android提供以下声明:Keyboard.hide()。结束。非常感谢。但安卓有一个问题。您必须使用InputMethodManager来隐藏键盘。好吧,好吧,这是 Android 的键盘 API。但!您需要拥有Context才能访问 IMM。现在我们有一个问题。我可能想从没有使用或不需要任何Context. 或者更糟糕的是,IMM 要求您指定要隐藏键盘的内容View(或者更糟糕的是,指定要隐藏的内容)。Window

这就是隐藏键盘如此具有挑战性的原因。亲爱的谷歌:当我查找蛋糕的食谱时,RecipeProvider地球上没有人会拒绝向我提供食谱,除非我首先回答谁会吃蛋糕以及在哪里吃蛋糕!

这个悲伤的故事以丑陋的事实结束:要隐藏 Android 键盘,您将需要提供 2 种形式的标识: aContext以及 aView或 a Window。

我创建了一个静态实用方法,只要您从Activity.

public static void hideKeyboard(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    //找到当前聚焦的视图,这样我们就可以从中获取正确的窗口令牌。
    View view = activity.getCurrentFocus();
    //如果当前没有视图具有焦点,则创建一个新视图,这样我们就可以从中获取窗口令牌
    if (view == null) {
        view = new View(activity);
    }
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

请注意,此实用方法仅在从Activity!调用时才有效。上述方法调用getCurrentFocus目标Activity来获取正确的窗口令牌。

EditText但是假设您想对托管在 a 中的主机隐藏键盘DialogFragment?您不能使用上面的方法:

hideKeyboard(getActivity()); //行不通

这是行不通的,因为您将传递对Fragment的 host 的引用Activity,而显示 时主机将没有焦点控制Fragment!哇!因此,为了隐藏片段中的键盘,我采用了较低级别、更常见且更丑陋的方法:

public static void hideKeyboardFrom(Context context, View view) {
    InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

以下是从浪费更多时间来追求此解决方案中收集到的一些附加信息:

关于windowSoftInputMode

还有一个争论点需要注意。默认情况下,Android 会自动将初始焦点分配EditText给Activity. 很自然地,InputMethod(通常是软键盘)将通过显示自身来响应焦点事件。windowSoftInputMode当中的属性设置AndroidManifest.xml为 时stateAlwaysHidden,指示键盘忽略此自动分配的初始焦点。

<activity
    android:name=".MyActivity"
    android:windowSoftInputMode="stateAlwaysHidden"/>

几乎令人难以置信的是,当您触摸控件时,它似乎没有采取任何措施阻止键盘打开(除非focusable="false"和/或focusableInTouchMode="false"被分配给控件)。显然,windowSoftInputMode设置仅适用于自动焦点事件,不适用于触摸事件触发的焦点事件。

因此,stateAlwaysHidden这个名字确实很糟糕。也许应该改为调用它ignoreInitialFocus。


更新:获取窗口令牌的更多方法

如果没有聚焦视图(例如,如果您刚刚更改了片段,则可能会发生),还有其他视图将提供有用的窗口令牌。

这些是上述代码的替代方案,if (view == null)   view = new View(activity); 它们没有明确引用您的活动。

在片段类中:

view = getView().getRootView().getWindowToken();

给定一个片段fragment作为参数:

view = fragment.getView().getRootView().getWindowToken();

从您的内容主体开始:

view = findViewById(android.R.id.content).getRootView().getWindowToken();

更新 2:清除焦点以避免在从后台打开应用程序时再次显示键盘

将此行添加到方法的末尾:

view.clearFocus();


文章来源地址https://www.toymoban.com/diary/problem/423.html

到此这篇关于如何以编程方式关闭/隐藏 Android 软键盘?的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/problem/423.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
一次编码,无处不在:深入探讨 .NET MAUI 的跨平台魔力
上一篇 2023年10月18日 14:55
在 TypeScript中扩展HTML元素的属性
下一篇 2023年10月18日 23:40

相关文章

  • android:登录界面,输入框输入数量达到了之后自动隐藏键盘。

    一、前言: 这篇文章是关于当我们输入账号密码时,达到11位(自定义)时,自动隐藏键盘。 二、上代码: 界面布局: 对应的Activity:LoginMainActivity 新建一个工具类:ViewUtil

    2024年02月12日
    浏览(42)
  • Android 全局监听软键盘弹起隐藏 动态修改布局并适配无限循环的问题

    要在 Android 应用中全局检测软键盘的弹起,您可以使用 ViewTreeObserver.OnGlobalLayoutListener 监听器来监听布局树的变化。当软键盘弹起或隐藏时,布局树会发生变化,因此您可以在监听器中捕获这些变化。 在上面的代码中, rootView 是您布局的根视图,您需要将其替换为您实际布局

    2024年02月11日
    浏览(40)
  • pyqt5 QWidget 如何隐藏右上角的关闭和提示按钮

    在 PyQt5 中,隐藏 QWidget 右上角的关闭按钮(也称为窗口关闭按钮)可以通过修改窗口的窗口标志位(WindowFlags)来实现。具体如下: import sys from PyQt5.QtWidgets import QApplication, QWidget class MyWidget(QWidget):     def __init__(self):         super().__init__()         self.initUI()     de

    2024年02月14日
    浏览(53)
  • 如何在Windows 10中打开或关闭屏幕键盘

    电脑有几种不同类型的键盘。最常见的类型是插入电脑的物理外部键盘。虽然 Windows 10 有触摸键盘,但它也有一个内置的易用工具,称为屏幕键盘(OSK),可以代替物理键盘在电脑屏幕上移动或输入文本。 使用OSK不需要触摸屏。它显示了一个带有所有标准键的可视键盘,因此

    2024年02月16日
    浏览(47)
  • WPF --- 如何以Binding方式隐藏DataGrid列

    如题,如何以Binding的方式动态隐藏DataGrid列? 像这样: 先在ViewModel创建数据源 People 和控制列隐藏的 IsVisibility ,这里直接以 MainWindow 为 DataContext 然后创建 VisibilityConverter ,将布尔值转化为 Visibility 。 然后再界面绑定 IsVisibility ,且使用转化器转化为 Visibility ,最后增加一个

    2024年02月05日
    浏览(63)
  • python多线程编程:如何优雅地关闭线程

    在并发编程中,我们可能会创建新线程,并在其中运行任务,可能由于一些原因,决定停止该线程。例如: 不再需要线程任务的结果了。 应用程序正在关闭。 线程执行可能已经出现了异常 关于python多线程编程知识,请参阅由浅入深掌握Python多线程编程 Threading 模块的 Threa

    2023年04月18日
    浏览(39)
  • android如何通过adb快速开启、关闭辅助副屏

    adb 指令 效果

    2024年02月01日
    浏览(52)
  • winform 关闭时隐藏到托盘

    需求: 点击主窗口关闭到托盘 1. 拖动一个notifyIcon 控件到窗口 2. 再动一个contextMenuStrip 到主窗口,做托盘里图标右键菜单使用, 3.菜单里两个选项: 显示主界面和退出 4. 绑定 notifyIcon 的 contextMenuStrip 为contextMenuStrip1 5. 主页面的FormClosing 事件,重写后加 显示任务栏图标且显

    2024年02月02日
    浏览(33)
  • VUE监听网页关闭和隐藏显示

    1.mounted()中创建页面关闭的监听   2.监听的是页面关闭之前,对应的方法可以写做 3.监听的是页面关闭的时候,这里面可以调用自己的异步处理 4.destroyed()中,注销监听

    2024年02月06日
    浏览(43)
  • 51单片机---编程实现流水灯----键盘控制数码管显示--利用74LS164扩展并行输出口---定时中断方式驱动一个数码管

    目录 基于51单片机,用c语言编程实现流水灯 代码: 使用C语言编写的基于51单片机的键盘控制数码管显示 代码: 基于51单片机,用c语言编程实现利用74LS164扩展并行输出口 代码: 基于51单片机,用c语言编程实现定时中断方式驱动一个数码管  代码:  1- 2- 上述代码中,使用

    2024年02月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包