最近在开发应用程序时,我遇到了一个问题.我在谷歌搜索了很多,但找不到任何解决方案.最后,我遇到了这个Android问题跟踪器
为了解释我的问题,我做了一个示例App.
我的示例应用程序的基本工作
- 我有一个屏幕,它有一个EditText,一个Button和一个RelativeLayout.
- RelativeLayout的宽度和高度为0px.它只是将焦点从EditText移开.
- 启动App时,焦点位于RelativeLayout,而不是EditText(因此其中没有闪烁的光标.)
- 当用户单击Button I时,只需使用RelativeLayout上的requestFocus()调用将焦点移动到RelativeLayout.
- 当用户点击EditText时,会出现键盘.我可以输入文字.
我想要实现的目标
- 如果我在键盘可见时改变手机的方向,那么在取消定位后,键盘应保持不变.
- 如果键盘是可见的,其他一些活动就会出现,例如闹钟,Facebook聊天头,打开通知区域的东西,锁定解锁设备等等.然后返回到示例应用程序键盘应该是可见的.
我是如何实现这一目标的
- 在onSaveInstanceState()中,我检查焦点是否在EditText上,然后在Bundle中放置一个布尔变量.
- 在onStop()中,我设置了一个布尔标志
wasEditing = true.
- 在onRestoreInstanceState()中,我检查了Bundle是否在onSaveInstanceState()中设置了标志值.如果是,那么我就是
wasEditing = true.
- 在onResume()中,我检查这个
wasEditing,如果是,我请求焦点为EditText.
- 之后我打电话
imm.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT,resultRec)
我遇到问题的地方
有时在执行此调用后,键盘在少数情况下不可见,例如在方向更改期间.
当我把日志我发现这个函数返回false
但是,如果我有这样的showSoftInput()电话使用100毫秒的延迟一些mEditText.postDelayed()在onResume()一切工作正常.
问题
在什么情况下此函数返回false并且为什么延迟有效?
注意
虽然我已经使用延迟解决了我的问题,但我仍然想知道为什么它表现得那样.