android软键盘 软键盘为什么会自动收起

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

我想隐藏键盘我期望为android软键盘提供以下声明:Keyboard.hide()。结束非常感謝你。但android软键盘存在问题您必须使用InputMethodManager隐藏键盘。好的很好,这是android软键盘的键盘API但!您需要拥有一个Context才能访问IMM。现在我们遇到了问题我可能想要将键盘隐藏在没有任何用途或需要的静态或实用程序类中Context。或者更糟糕的是IMM要求您指定要隐藏键盘FROM的内容View(甚至更糟Window)。

這使得隐藏键盘变得如此具有挑战性亲爱的谷歌:当我正在寻找蛋糕RecipeProvider的食谱时,除非我第一次回答世界卫生组织否则地球上没有人拒絕向我提供食谱,蛋糕将被吃掉它会被吃掉!

这个悲伤的故事以丑陋的事实结束:要隐藏android软键盘键盘,您需要提供两种形式的识别:a Context和a View戓a Window

我已经创建了一个静态实用程序方法,可以非常稳定地完成工作前提是你从中调用它Activity。

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

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

这不起作用,因为你将傳递一个对Fragment主机的引用Activity它在显示时没有集中控制Fragment!哇!所以,为了从键盘中隐藏键盘我采用较低级别,更常见更丑陋:

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

还有另一个争论点需要注意。默认情况下android软键盘会自动将初始焦点分配给您的第┅个EditText或可聚焦控件Activity。由此可见InputMethod(通常是软键盘)将通过显示自身来响应焦点事件。的windowSoftInputMode属性中android软键盘Manifest.xml当设置为stateAlwaysHidden,指示键盘忽略这个自动汾配的初始焦点

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

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

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

给定片段fragment作为参数:

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

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

我要回帖

更多关于 android软键盘 的文章

 

随机推荐