Android 如何在活动之前关闭另一个应用程序打开的延迟键盘';第一个布局是什么?

Android 如何在活动之前关闭另一个应用程序打开的延迟键盘';第一个布局是什么?,android,Android,有很多答案解释了如何关闭Android的软键盘(例如),但它们都假设键盘是从您自己的应用程序中打开的,或者您已经有了可以获得焦点的视图,从而超过了以前应用程序的需要。在Android的InputMethodManager类中,关闭另一个应用程序打开的键盘的请求被拒绝,对hideSoftInputFromWindow()的调用返回false 我团队的一位开发人员在Activity上创建了一个扩展方法,每当键盘状态发生变化时,它都会调用一块代码。因为Android不会自己启动键盘显示/隐藏事件(这很

有很多答案解释了如何关闭Android的软键盘(例如),但它们都假设键盘是从您自己的应用程序中打开的,或者您已经有了可以获得焦点的视图,从而超过了以前应用程序的需要。在Android的
InputMethodManager
类中,关闭另一个应用程序打开的键盘的请求被拒绝,对
hideSoftInputFromWindow()
的调用返回false

我团队的一位开发人员在
Activity
上创建了一个扩展方法,每当键盘状态发生变化时,它都会调用一块代码。因为Android不会自己启动键盘显示/隐藏事件(这很荒谬),所以通常的做法是检测
活动
根布局的高度降低,并假设这意味着键盘已打开。(注意:这仅适用于
windowSoftInputMode=“adjustResize”
)此扩展方法(在
onCreate()
中调用)在调用时记录根布局的高度,并观察高度的后续更改。如果布局的高度变小,则假定已显示键盘。如果它变大了,就认为键盘是隐藏的。虽然这种非确定性的攻击是不幸的,但只要你不依赖于100%的准确度,它是有用的

不幸的是,它在这种情况下不起作用:

  • 用户在另一个应用程序中启动,键盘打开
  • 用户点击来自我的应用程序的通知
  • 我的应用程序打开(冷启动),另一个应用程序的键盘仍然打开
  • 从onCreate()调用扩展方法时,“我的活动”根布局的高度已经反映了键盘打开的事实,这打破了在键盘打开时观察它变短的概念
  • 虽然可能有一些方法可以改进逻辑,使其更加健壮,但我真正想做的是可靠地关闭“外置”键盘,它会偏离我对应用程序高度的基线测量。但是我已经尝试在我的
    AndroidManifest.xml
    文件中为所讨论的
    活动设置
    windowSoftInputMode=“stateHidden”
    ,并且尝试调用
    InputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),0)
    。这两种方法都不起作用;如果键盘是由另一个应用程序打开的,而我还没有具有焦点的视图,
    InputMethodManager
    拒绝我关闭键盘的尝试,可能是为了防止我控制另一个应用程序拥有的键盘的可见性


    启动自己的
    活动
    时,是否有办法立即关闭另一个应用程序中的延迟键盘,以便在第一次布局时键盘消失?在我看来,
    stateHidden
    不能为您做到这一点是一个缺陷。

    键盘仍然处于运行状态是一个缺陷。但据我所知,没有办法通过编程解决这个问题。问题是,键盘是在连接的基础上工作的,而连接是与以前的应用程序连接的。所以,在你建立联系之前,没有办法和它交谈

    你提到的尺寸问题确实是应该避免的,因为它远没有达到100%。还有其他一些东西打破了它,比如分屏、画中画模式,最有可能的是新型折叠式手机。还可以将其连接到任何显示器。这是“常见”的做法,只有那些不太了解代码、不测试代码的人才会这样做。基本上是一段漂浮的代码碎片,因为它可以工作,人们不会看得更深

    您可以将焦点设置为窗口中接受文本输入的视图。这将迫使建立联系。但在结束它的时候,你会有jank,在没有问题的情况下会发生

    最后,解决方案是编写应用程序,使其不关心键盘状态,并且在键盘打开/关闭时不尝试更改应用程序的行为或外观,因为操作系统并不适合它


    完全同意您的看法,操作系统应该支持这一点。但自从2010年我写键盘以来,我就一直这么说。它还没变,我没想到。。。真的。谷歌从未对改进键盘API表现出太大的兴趣,即使我在世界上最大的第三方键盘应用程序上工作时,他们也不需要反馈或投入资源。

    我担心这就是答案。在将此标记为已接受之前,我将把这个问题留待一会儿,希望其他人找到一个有效的技巧。Re:我同意这一评论,即“解决方案是编写应用程序,使其不关心键盘状态”。但在我们的例子中,这会导致复杂性或低于标准的用户体验。我们有一个底部导航栏,当键盘可见时,我们想隐藏它。否则,它将在键盘顶部和EditText底部之间保持可见,EditText位于可滚动列表中。我们已经找到了解决方法,但它们需要易于出现错误的状态管理,或者从
    adjustResize
    临时切换到
    adjustPan
    ,直到编辑文本失去焦点。了解键盘状态本身就很有价值。@MarkMcClelland我同意能够了解这一点是非常棒的。你就是不能。没有重大故障点,就没有解决办法。尺寸是最好的,而且有问题。这是操作系统的架构问题。一个他们可以很容易地修复,如果他们想,但没有兴趣。