关闭/隐藏Android软键盘
我的布局中有一个EditText
和一个Button
。
在编辑栏中写入并单击Button
,我想要隐藏虚拟键盘。 我认为这是一段简单的代码,但我可以在哪里找到它的一个例子?
您可以强制Android使用InputMethodManager隐藏虚拟键盘,调用hideSoftInputFromWindow
,传入含有焦点视图的窗口标记。
// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
这将迫使键盘在所有情况下都隐藏起来。 在某些情况下,您会希望传入InputMethodManager.HIDE_IMPLICIT_ONLY
作为第二个参数,以确保只在用户没有明确强制显示时才隐藏键盘(通过按住菜单)。
为了澄清这种疯狂,我想首先代表所有Android用户道歉,因为谷歌对软键盘的彻底荒谬处理。 对于同样简单的问题,有很多答案各不相同,这是因为与Android中的其他许多API一样,这个API的设计非常糟糕。 我可以想到没有礼貌的方式来陈述它。
我想隐藏键盘。 我期望为Android提供以下语句: Keyboard.hide()
。 结束。 非常感谢你。 但Android有一个问题。 您必须使用InputMethodManager
来隐藏键盘。 好的,很好,这是Android的键盘API。 但! 您需要有一个Context
才能访问IMM。 现在我们有一个问题。 我可能希望将键盘从静态或实用程序类中隐藏起来,该类没有任何用处或者不需要任何Context
。 或者更糟糕的是,IMM要求您指定要隐藏键盘FROM的View
(甚至更糟,是哪个Window
)。
这就是隐藏键盘如此具有挑战性的原因。 亲爱的Google:当我查找蛋糕的食谱时,地球上没有RecipeProvider
会拒绝为我提供配方,除非我第一次回答WHO蛋糕将被吃掉,并且它将被吃掉!
这个令人伤心的故事以丑陋的真相结束:为了隐藏Android键盘,您将需要提供两种识别形式: Context
以及View
或Window
。
我创建了一个静态实用程序方法,只要您从一个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
调用时才有效! 上述方法调用目标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将自动分配初始焦点设置到第一EditText
您或可成为焦点的控制Activity
。 自然地,InputMethod(通常是软键盘)将通过显示自己来响应焦点事件。 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();
隐藏软键盘也很有用:
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
);
这可以用来抑制软键盘,直到用户实际触摸editText视图为止。
链接地址: http://www.djcxy.com/p/329.html上一篇: Close/hide the Android Soft Keyboard
下一篇: How to validate an email address using a regular expression?