做安卓开发的时候,会有各种各样的想法和疑问,例如:怎么对软键盘关闭或者怎么对软键盘隐藏?
问题
我的布局中有一个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:清除焦点以避免在从后台打开应用程序时再次显示键盘
将此行添加到方法的末尾:文章来源:https://www.toymoban.com/diary/problem/423.html
view.clearFocus();
文章来源地址https://www.toymoban.com/diary/problem/423.html
到此这篇关于如何以编程方式关闭/隐藏 Android 软键盘?的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!