为什么android InputMethodManager.showSoftInput()返回false?

Vip*_*rma 8 keyboard android android-softkeyboard android-input-method

最近在开发应用程序时,我遇到了一个问题.我在谷歌搜索了很多,但找不到任何解决方案.最后,我遇到了这个Android问题跟踪器

为了解释我的问题,我做了一个示例App.

我的示例应用程序的基本工作

  1. 我有一个屏幕,它有一个EditText,一个Button和一个RelativeLayout.
  2. RelativeLayout的宽度和高度为0px.它只是将焦点从EditText移开.
  3. 启动App时,焦点位于RelativeLayout,而不是EditText(因此其中没有闪烁的光标.)
  4. 当用户单击Button I时,只需使用RelativeLayout上的requestFocus()调用将焦点移动到RelativeLayout.
  5. 当用户点击EditText时,会出现键盘.我可以输入文字.

我想要实现的目标

  1. 如果我在键盘可见时改变手机的方向,那么在取消定位后,键盘应保持不变.
  2. 如果键盘是可见的,其他一些活动就会出现,例如闹钟,Facebook聊天头,打开通知区域的东西,锁定解锁设备等等.然后返回到示例应用程序键盘应该是可见的.

我是如何实现这一目标的

  1. 在onSaveInstanceState()中,我检查焦点是否在EditText上,然后在Bundle中放置一个布尔变量.
  2. 在onStop()中,我设置了一个布尔标志wasEditing = true.
  3. 在onRestoreInstanceState()中,我检查了Bundle是否在onSaveInstanceState()中设置了标志值.如果是,那么我就是wasEditing = true.
  4. 在onResume()中,我检查这个wasEditing,如果是,我请求焦点为EditText.
  5. 之后我打电话 imm.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT,resultRec)

我遇到问题的地方
有时在执行此调用后,键盘在少数情况下不可见,例如在方向更改期间.
当我把日志我发现这个函数返回false
但是,如果我有这样的showSoftInput()电话使用100毫秒的延迟一些mEditText.postDelayed()onResume()一切工作正常.

问题 在什么情况下此函数返回false并且为什么延迟有效?

注意 虽然我已经使用延迟解决了我的问题,但我仍然想知道为什么它表现得那样.

小智 1

这也是我今天遇到的一个问题。在我的 8 台 Android 设备中,只有 1 台存在问题,并且运行的是 Android 4.0.4。

通过添加解决了该问题

mEditText.requestFocus();
mEditText.requestFocusFromTouch();
Run Code Online (Sandbox Code Playgroud)

在调用 mEditText.showSoftInput(...) 之前

你会看到resultcodefromshowSoftInput是 now true。我注意到之后mEditText.requestFocus()isFocused()静止的false。可能是 Android 4.0 甚至 4.1 中的一个错误。