首页 > 编程语言 >如何以编程方式关闭/隐藏Android软键盘?

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

时间:2023-10-16 21:37:59浏览次数:33  
标签:编程 键盘 软键盘 Activity Android View 隐藏 view

内容来自 DOC https://q.houxu6.top/?s=如何以编程方式关闭/隐藏Android软键盘?

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

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


为了澄清这个疯狂的问题,我想首先代表所有 Android 用户就谷歌对软键盘的荒谬处理道歉。为什么对于同一个简单问题有如此多不同的答案,每个答案都不同呢?这是因为这个 API(就像 Android 中的许多其他 API)设计得非常糟糕。我找不到任何礼貌的方式来表达它。

我想要隐藏键盘。我希望提供给 Android 以下语句:Keyboard.hide()。结束。非常感谢。但是 Android 有一个问题。你必须使用 InputMethodManager 来隐藏键盘。好的,可以接受,这是 Android 的 API 来控制键盘。但是!你必须有一个 Context 才能访问 IMM。现在我们有问题了。我可能希望从一个没有使用或需要任何 Context 的静态或实用类中隐藏键盘,或者更糟糕的是,IMM 要求你指定要隐藏键盘的 View(甚至更糟糕的是,指定要隐藏键盘的 Window)。

这使得隐藏键盘变得非常具有挑战性。亲爱的谷歌:当我在寻找蛋糕的食谱时,地球上没有 RecipeProvider 会拒绝提供食谱,除非我先回答蛋糕将由谁享用以及在哪里享用!

这个悲伤的故事以丑陋的事实结束:要隐藏 Android 键盘,你必须提供两种形式的标识:一个 Context 和一个 ViewWindow

我创建了一个静态实用方法,可以在提供 Activity 的情况下非常可靠地工作。

public static void hideKeyboard(Activity activity) {
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
    //Find the currently focused view, so we can grab the correct window token from it.
    View view = activity.getCurrentFocus();
    //If no view currently has focus, create a new one, just so we can grab a window token from it
    if (view == null) {
        view = new View(activity);
    }
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

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

但是假设你想要从 DialogFragment 中隐藏键盘,你不能使用上面的代码:

hideKeyboard(getActivity()); //won't work

这不会起作用,因为你将传递到 Fragment 的宿主 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 会自动将初始焦点分配给你的 Activity 中的第一个 EditText 或可聚焦控件。自然地,由于焦点事件,输入法(通常是软键盘)会响应并显示自己。在 AndroidManifest.xml 中设置的 windowSoftInputMode 属性为 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();

标签:编程,键盘,软键盘,Activity,Android,View,隐藏,view
From: https://www.cnblogs.com/xiaomandujia/p/17768389.html

相关文章

  • 实验二 c语言分支与循环基础应用编程
    实验一源代码#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1374#defineN2465intmain(){ intnumber; inti; srand(time(0)); for(i=0;i<N;i++) { number=rand()%(N2-N1+1)+N1; printf("20238329%04......
  • CEIT 23练习编程题 题解
    本文部分题目提供c/c++两种解法,顺便可以让你们知道c++在面对某些题时的优势部分题目提供多种解法日期格式化C#include<stdio.h>intmain(){intm,d,y;scanf("%d-%d-%d",&m,&d,&y);printf("%04d-%02d-%02d",y,m,d);return0;}02d的含义:当有效数......
  • socket编程
    1.什么是socket编程socket编程简介:能够唯一标示网络中的进程后,它们就可以利用Socket进行通信了,什么是Socket呢?我们经常把Socket翻译为套接字,Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信基......
  • 实验2 C语言分支与循环基础应用编程
    一、实验目的能正确使用if语句、switch语句实现分支结构能正确使用while语句、do...while语句、for语句实现循环结构能在具体问题场景中使用嵌套分支语句和嵌套循环语句能在具体问题场景中正确区分、使用continue和break能灵活、组合使用c语句编程解决简单应用问题二、实......
  • 实验2 C语言分支与循环基础应用编程
    练习1#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1374#defineN2465intmain(){intnumber;inti;srand(time(0));//以当前系统时间作为随机种子for(i=0;i<N;++i){number=rand()%(N2-N1......
  • 实验2_C语言分支与循环基础应用编程
    1.task_11#include<stdio.h>2#include<stdlib.h>3#include<time.h>45#defineN56#defineN13747#defineN246589intmain()10{11intnumber;12inti;1314srand(time(0));1516for......
  • 什么才算是真正的编程能力?
    大家好,我是陶朱公Boy,一个认真生活,总想超越自己的程序员。前言知乎上有一个提问:什么才算是真正的编程能力?             ↓↓↓今天,我们就这个话题,一起来做个讨论。首先问大家一个问题:程序员的你觉得编程能力强可以有哪些指标来衡量?是能从0-1......
  • ABB机器人示教器中设置可编程按钮
    ABB机器人是一种在工业自动化中广泛使用的机器人,具有高效率、高精度、高可靠性等优点,已经成为现代制造业的重要装备之一。为了方便操作,ABB机器人示教器中设置了可编程按钮,通过设置这些按钮,可以将复杂的操作简化成一键操作的效果,从而提高生产效率。下面,我们来详细介绍如何在ABB......
  • Android获取第二个SD卡路径
    File[]externalFilesDirs=getExternalFilesDirs(null);//判断是否有第二个SD卡if(externalFilesDirs.length>1){//第二个SD卡的路径FilesecondSdCardDir=externalFilesDirs[1];}else{//如果没有第二个SD卡,则根据需要进行处理}getExtern......
  • 实验1 类和对象编程_基础编程1
    实验任务1task1.cpp//标准库string,vector,array基础用法#include<iostream>#include<string>#include<vector>#include<array>//函数模板//对满足特定条件的序列类型T对象,使用范围for输出template<typenameT>voidoutput1(constT&obj){for(aut......