ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关闭/隐藏Android软键盘

2019-09-10 23:24:14  阅读:290  来源: 互联网

标签:android-input-method android android-layout android-softkeyboard soft-keyboard


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

在编辑字段中写入并单击按钮后,我想隐藏虚拟键盘.我假设这是一段简单的代码,但我在哪里可以找到它的一个例子?

解决方法:

为了帮助澄清这种疯狂,我想首先代表所有Android用户道歉,谷歌对软键盘的彻头彻尾的荒谬处理.对于同样简单的问题,有这么多答案的原因有很多,因为这个API与Android中的许多其他API一样,设计非常糟糕.我认为没有礼貌的方式来陈述它.

我想隐藏键盘.我期望为Android提供以下声明:Keyboard.hide().结束.非常感谢你.但Android存在问题.您必须使用InputMethodManager来隐藏键盘.好的,很好,这是Android的键盘API.但!您需要具有上下文才能访问IMM.现在我们遇到了问题.我可能想要从没有任何使用或不需要任何Context的静态或实用程序类中隐藏键盘.或者更糟糕的是,IMM要求您指定要隐藏键盘FROM的View(或更糟糕的是,什么Window).

这使得隐藏键盘变得如此具有挑战性.亲爱的谷歌:当我查找蛋糕的配方时,地球上没有RecipeProvider会拒绝向我提供配方,除非我第一次回答世界卫生组织,蛋糕将被吃掉,哪里会被吃掉!

这个悲伤的故事以丑陋的事实结束:要隐藏Android键盘,您需要提供两种形式的识别:上下文以及视图或窗口.

我已经创建了一个静态实用程序方法,只要你从一个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的getCurrentFocus来获取正确的窗口标记.

但是假设您想要从DialogFragment中托管的EditText中隐藏键盘?你不能使用上面的方法:

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或focusable控件.由此可见,InputMethod(通常是软键盘)将通过显示自身来响应焦点事件. AndroidManifest.xml中的windowSoftInputMode属性设置为stateAlwaysHidden时,指示键盘忽略此自动分配的初始焦点.

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

几乎令人难以置信的是,当您触摸控件时,似乎无法阻止键盘打开(除非将focusable =“false”和/或focusableInTouchMode =“false”分配给控件).显然,windowSoftInputMode设置仅适用于自动焦点事件,而不适用于触摸由触摸事件触发的事件.

因此,stateAlwaysHidden的名字确实非常糟糕.它也许应该被称为ignoreInitialFocus.

希望这可以帮助.

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

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

如果(view == null)view = new View(activity);这些是上述代码的替代品.这些并未明确提及您的活动.

在片段类中:

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

给定片段片段作为参数:

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

从您的内容正文开始:

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

更新2:如果您从后台打开应用程序,请清除焦点以避免再次显示键盘

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

view.clearFocus();

标签:android-input-method,android,android-layout,android-softkeyboard,soft-keyboard
来源: https://codeday.me/bug/20190910/1802158.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有