首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么android InputMethodManager.showSoftInput()返回false?

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

Stack Overflow用户
提问于 2014-04-30 05:11:25
回答 3查看 6.3K关注 0票数 10

最近,在开发一个应用程序时,我遇到了一个问题。我在谷歌上搜索了很多,但没有找到任何解决方案。最后我遇到了这个Android issue tracker

为了解释我的问题,我制作了一个示例应用程序。

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

  1. 我有一个屏幕,它有一个EditText、一个按钮和一个RelativeLayout。
  2. RelativeLayout的宽度和高度为0 0px。这只是一个将焦点从EditText移开的视图。
  3. 当应用程序启动时,焦点放在RelativeLayout上,而不是EditText上(这样就不会有闪烁的光标)。
  4. 当用户单击Button时,我只需使用requestFocus()调用RelativeLayout将焦点移到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()中的mEditText.postDelayed()时延迟了100 in进行这个onResume()调用,一切都可以正常工作。

问题,在什么情况下,此函数返回false,以及为什么延迟工作?

Note虽然我已经用延迟解决了我的问题,但是我仍然想知道为什么会这样。

EN

回答 3

Stack Overflow用户

发布于 2014-06-13 20:26:02

这也是我今天遇到的问题。在我的8台android设备中,只有1台有问题,而且运行的是Android4.0.4。

这个问题是通过添加

代码语言:javascript
复制
mEditText.requestFocus();
mEditText.requestFocusFromTouch();

在调用mEditText.showSoftInput(.)之前

您将看到resultcodeshowSoftInput现在是true。我注意到在mEditText.requestFocus()之后,isFocused()仍然是false。可能是Android4.0和4.1中的一个bug。

票数 1
EN

Stack Overflow用户

发布于 2019-05-24 12:02:00

在您的showKeyboard连接到窗口后,请致电mEditText。请确定你打电话的时间。

票数 0
EN

Stack Overflow用户

发布于 2022-11-15 08:38:50

问题:

我面对这个键盘没有出现问题。我发现下面的解决方案是受这个answer启发的,但不是他们的解决方案!简而言之,造成这种混乱的原因是请求焦点和IMM提供的服务只能在创建和激活的视图上运行。当您在创建阶段onCreate(Bundle savedInstance).. or onCreateView(LayoutInflater inflater...上执行所有这些操作,并且视图仍然处于初始化状态时,您将不会得到一个活动视图来操作!我已经看到许多解决方案使用延迟和检查来等待视图激活,然后执行显示键盘,但是下面是基于android框架工作设计的解决方案:

解决方案:

在您的活动或片段中,请确保视图具有访问权限(将其定义在活动/片段的顶部):

代码语言:javascript
复制
 @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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23380123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档