最近在开发应用程序时,我遇到了一个问题。我在谷歌上搜索了很多,但找不到任何解决方案。最后我遇到了这个Android问题跟踪器
为了解释我的问题,我制作了一个示例应用程序。
我的示例应用程序的基本工作
- 我有一个屏幕,它有一个EditText、一个Button和一个RelativeLayout
- RelativeLayout的宽度和高度为0px。这只是一个将焦点从EditText移开的视图
- 当应用程序启动时,重点是RelativeLayout,而不是EditText(这样就不会有闪烁的光标)
- 当用户单击按钮时,我只需使用对RelativeLayout的requestFocus()调用将焦点移动到RelativeLLayout
- 当用户点击EditText时,键盘就会出现。我可以在其中输入文本
我想要实现的目标
- 若我在键盘可见时改变手机的方向,那个么在方向改变后,键盘应该保持不变
- 如果键盘是可见的,并且它上面有一些其他活动,例如警报、facebook聊天头、从通知区打开东西、锁定解锁设备等。那么在返回示例应用程序时,键盘应该是可见的
我是如何做到这一点的
- 在onSaveInstanceState()中,我检查焦点是否在EditText上,然后在Bundle中放入一个布尔变量
- 在onStop()中,我设置了一个一布尔值标志
wasEditing = true
- 在onRestoreInstanceState()中,我检查Bundle是否在onSaveInstanceState[()中设置了标志值。如果是,那么我将成为
wasEditing = true
- 在onResume()中,我检查这个
wasEditing
,如果它是真的,我请求关注EditText - 之后我打电话给
imm.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT,resultRec)
哪里有问题
有时在执行此调用后,键盘在少数情况下不可见,例如在方向更改期间
当我放入我发现的日志时,此函数返回false
但是,如果我在onResume()
中使用mEditText.postDelayed()
以100ms的延迟进行showSoftInput()
调用,一切都会正常工作。
问题在什么情况下,此函数返回false?为什么延迟有效?
注意虽然我已经用延迟解决了我的问题,但我仍然想知道它为什么会这样。
这也是我今天遇到的一个问题。在我的8台安卓设备中,只有1台有问题,它运行的是安卓4.0.4。
通过添加解决了问题
mEditText.requestFocus();
mEditText.requestFocusFromTouch();
打电话之前mEditText.showSoftInput(…)
您将看到showSoftInput
的resultcode
现在是true
。我注意到在mEditText.requestFocus()
之后,isFocused()
仍然是false
。可能是安卓4.0和4.1中的一个错误。
请在mEditText附加到窗口后调用showKeyboard。请确定你打电话的时间。
问题:
我面对这个键盘不出现的问题。我发现以下解决方案的灵感来自这个答案,但不是他们的解决方案!简而言之,造成这种混乱的原因是请求焦点和IMM提供的服务只能在创建并处于活动状态的视图上运行。当您在创建阶段onCreate(Bundle savedInstance).. or onCreateView(LayoutInflater inflater...
执行所有这些操作,并且视图仍处于初始化状态时,您将无法获得要操作的活动视图!我见过许多使用延迟和检查来等待视图激活然后显示键盘的解决方案,但这里是我基于android框架设计的解决方案:
解决方案:
在您的活动或片段覆盖中,请确保您的视图具有访问权限(在活动/片段的顶部定义):
@Override
public void onStart() {
yourView.requestFocus();
showSoftKeyboard(yourView);
super.onStart();
}
public void showSoftKeyboard(View view) {
if(view.requestFocus()){
InputMethodManager imm = (InputMethodManager)
mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
}