Android 如何在活动之前关闭另一个应用程序打开的延迟键盘';第一个布局是什么?
有很多答案解释了如何关闭Android的软键盘(例如),但它们都假设键盘是从您自己的应用程序中打开的,或者您已经有了可以获得焦点的视图,从而超过了以前应用程序的需要。在Android的Android 如何在活动之前关闭另一个应用程序打开的延迟键盘';第一个布局是什么?,android,Android,有很多答案解释了如何关闭Android的软键盘(例如),但它们都假设键盘是从您自己的应用程序中打开的,或者您已经有了可以获得焦点的视图,从而超过了以前应用程序的需要。在Android的InputMethodManager类中,关闭另一个应用程序打开的键盘的请求被拒绝,对hideSoftInputFromWindow()的调用返回false 我团队的一位开发人员在Activity上创建了一个扩展方法,每当键盘状态发生变化时,它都会调用一块代码。因为Android不会自己启动键盘显示/隐藏事件(这很
InputMethodManager
类中,关闭另一个应用程序打开的键盘的请求被拒绝,对hideSoftInputFromWindow()
的调用返回false
我团队的一位开发人员在Activity
上创建了一个扩展方法,每当键盘状态发生变化时,它都会调用一块代码。因为Android不会自己启动键盘显示/隐藏事件(这很荒谬),所以通常的做法是检测活动
根布局的高度降低,并假设这意味着键盘已打开。(注意:这仅适用于windowSoftInputMode=“adjustResize”
)此扩展方法(在onCreate()
中调用)在调用时记录根布局的高度,并观察高度的后续更改。如果布局的高度变小,则假定已显示键盘。如果它变大了,就认为键盘是隐藏的。虽然这种非确定性的攻击是不幸的,但只要你不依赖于100%的准确度,它是有用的
不幸的是,它在这种情况下不起作用:
AndroidManifest.xml
文件中为所讨论的活动设置windowSoftInputMode=“stateHidden”
,并且尝试调用InputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),0)
。这两种方法都不起作用;如果键盘是由另一个应用程序打开的,而我还没有具有焦点的视图,InputMethodManager
拒绝我关闭键盘的尝试,可能是为了防止我控制另一个应用程序拥有的键盘的可见性
启动自己的活动
时,是否有办法立即关闭另一个应用程序中的延迟键盘,以便在第一次布局时键盘消失?在我看来,stateHidden
不能为您做到这一点是一个缺陷。键盘仍然处于运行状态是一个缺陷。但据我所知,没有办法通过编程解决这个问题。问题是,键盘是在连接的基础上工作的,而连接是与以前的应用程序连接的。所以,在你建立联系之前,没有办法和它交谈
你提到的尺寸问题确实是应该避免的,因为它远没有达到100%。还有其他一些东西打破了它,比如分屏、画中画模式,最有可能的是新型折叠式手机。还可以将其连接到任何显示器。这是“常见”的做法,只有那些不太了解代码、不测试代码的人才会这样做。基本上是一段漂浮的代码碎片,因为它可以工作,人们不会看得更深
您可以将焦点设置为窗口中接受文本输入的视图。这将迫使建立联系。但在结束它的时候,你会有jank,在没有问题的情况下会发生
最后,解决方案是编写应用程序,使其不关心键盘状态,并且在键盘打开/关闭时不尝试更改应用程序的行为或外观,因为操作系统并不适合它
完全同意您的看法,操作系统应该支持这一点。但自从2010年我写键盘以来,我就一直这么说。它还没变,我没想到。。。真的。谷歌从未对改进键盘API表现出太大的兴趣,即使我在世界上最大的第三方键盘应用程序上工作时,他们也不需要反馈或投入资源。我担心这就是答案。在将此标记为已接受之前,我将把这个问题留待一会儿,希望其他人找到一个有效的技巧。Re:我同意这一评论,即“解决方案是编写应用程序,使其不关心键盘状态”。但在我们的例子中,这会导致复杂性或低于标准的用户体验。我们有一个底部导航栏,当键盘可见时,我们想隐藏它。否则,它将在键盘顶部和EditText底部之间保持可见,EditText位于可滚动列表中。我们已经找到了解决方法,但它们需要易于出现错误的状态管理,或者从adjustResize
临时切换到adjustPan
,直到编辑文本失去焦点。了解键盘状态本身就很有价值。@MarkMcClelland我同意能够了解这一点是非常棒的。你就是不能。没有重大故障点,就没有解决办法。尺寸是最好的,而且有问题。这是操作系统的架构问题。一个他们可以很容易地修复,如果他们想,但没有兴趣。