从电子邮件客户端返回后,键盘无法关闭

5

我有一个安卓应用程序,可以通过电子邮件共享一份杂货清单。但是我遇到了一个问题,就是在使用电子邮件客户端(可能是Exchange客户端或Gmail客户端)发送完列表后,键盘无法关闭。

我尝试过以下解决方法:

InputMethodManager mgr = (InputMethodManager) getSystemService(
        Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromWindow(editTxt.getWindowToken(), 0);

还有许多其他方法。如果我检查键盘是否打开,它将返回false,因为调用键盘的不是应用程序,而是电子邮件客户端。

我发现了一个解决方法,包括:

android:windowSoftInputMode="stateAlwaysHidden"

如果应用程序强制关闭键盘,但每次重新打开键盘时仍然会出现延迟。

对于三星手机,只有在使用Gmail客户端时才存在该问题。

3个回答

2

找到了解决方案。在几毫秒后,焦点从应用程序外部(电子邮件客户端)转移到editText视图。然后我可以关闭键盘。 因此,我的解决方案如下:

Timer timer = new Timer();
timer.schedule(new TimerTask() {

            @Override
            public void run() {
                closeKeyboard();
            }
        }, 20);

没有比轮询更清晰的方式了,我想。即使是通过轮询,对吧?我试图深入研究输入法服务方法和数据结构的字段,但未能找到与当前焦点相关的任何内容。 - Meymann

0

在你的清单文件中的activity标签中使用android:windowSoftInputMode="stateHidden"


你提到你使用了stateAlwaysHidden...不要使用它,改用stateHidden。对于类似的情况,这对我很有效。 - stinepike
抱歉,我的错。我提到stateAlwaysHidden只是为了解决从意图返回时关闭键盘的问题。 - lagos

0
你把这段代码放在 onResume() 方法里面吗?

我使用startActivityForResult()来触发意图,所以我将代码放在onActivityResult中。但是我会尝试将其放在onResume()方法中,值得一试。 - lagos
我试图将它放在onResume()中,但问题是应用程序无法识别键盘是否打开,因为应用程序没有调用打开键盘。因此,键盘没有聚焦在editTxt上,因此我无法关闭它。我还尝试过 InputMethodManager im = (InputMethodManager)this.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE); im.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY); - lagos
你可以使用布尔值来实现一个小技巧... 尝试在这个活动中加入一个布尔值。当你从应用程序的另一个活动返回时,在 onCreate() 方法中将这个布尔值设置为 TRUE... 当你从电子邮件客户端返回时,不要实例化这个布尔值(或者将其设置为 FALSE),当这个布尔值等于 FALSE 时,隐藏键盘的条件就满足了。 - StephaneT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接