Android 软键盘隐藏调用在view.post()中未按预期工作,但在runOnUIThread()中工作正常

Android 软键盘隐藏调用在view.post()中未按预期工作,但在runOnUIThread()中工作正常,android,android-input-method,postdelayed,android-runonuithread,Android,Android Input Method,Postdelayed,Android Runonuithread,当我(从片段内部)调用以将键盘隐藏在runOnUiThread()中时,键盘会隐藏,但当我从activity.getCurrentFocus().post()内部执行相同操作时,键盘不会隐藏 1) 下面的代码有效 activity.runOnUiThread(new Runnable() { @Override public void run()

当我(从片段内部)调用以将键盘隐藏在runOnUiThread()中时,键盘会隐藏,但当我从activity.getCurrentFocus().post()内部执行相同操作时,键盘不会隐藏

1) 下面的代码有效

activity.runOnUiThread(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                            imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                        }
            });
2) 但事实并非如此

 activity.getCurrentFocus().post(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                            imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                        }
            });
其中
view=activity.getCurrentFocus()

android文档说明如下:-

a) public final void rununuithread(可运行操作)-在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将操作发布到UI线程的事件队列

b) public boolean post(Runnable操作)-导致将Runnable添加到消息队列中。runnable将在用户界面线程上运行


请有人解释一下,谢谢

我认为当您执行
activity.getCurrentFocus().post()
时,它会在视图布局、重新调整大小和更新完成后执行。因此,如果您的视图不需要更新,就不会执行。您是否尝试添加日志/断点以查看它是否已执行?
如果执行了,可能是键盘刚刚恢复。

Hello@beef,谢谢你的回答,代码正在执行,键盘根本不会隐藏。虽然有一些不同,在执行隐藏键盘调用之前,键盘上有一个“完成”按钮,在键盘顶部有一些单词建议,但在使用getCurrentFocus().post()隐藏键盘调用之后,完成按钮变成了一个回车按钮,键盘顶部不再有单词建议,但键盘并没有隐藏。不管怎么说,当我使用runOnUiThread时,键盘总是隐藏起来。@Ajit这很有趣。“完成”按钮变为“输入”按钮表明键盘被要求显示,但没有收到有关文本字段的正确信息。比如它是什么类型的文本字段。现在的问题是为什么要求键盘再次出现。。。也许用Traceview来看看叫什么