我不知道这是否与您的问题有关,但是当设备有时会“不同步”并在我想显示时隐藏时,我仅使用 InputMethodManager.toggleSoftInput() 时遇到了一些问题,反之亦然.
我利用以下事实取得了一些成功:虽然 IMM.showSoftInput() 不会显示键盘,但 IMM.hideSoftInputFromWindow() 会可靠关闭一个,所以当我想显示一个键盘时,我现在调用 IMM.hideSoftInputFromWindow(),然后调用 IMM.toggleSoftInput(),并单独使用 IMM.hideSoftInputFromWindow() 来隐藏一个。
[一天后...]
昨天写上面的内容让我重新思考我是如何处理软键盘的(我的意思是,showSoftinput() 确实工作,只是不是我们期望的那样),所以这里有一个更好的方法:
首先,您需要设置您的视图,以便 Android 知道它可以有一个软键盘 - 在 InputMethodManager 的文档中进行了描述。就我而言,我有一个从 GLSurfaceView 派生的视图,因此我添加了:
setFocusable(true);
setFocusableInTouchMode(true);
到构造函数,然后是以下 2 个覆盖:
@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs)
{
outAttrs.actionLabel = "";
outAttrs.hintText = "";
outAttrs.initialCapsMode = 0;
outAttrs.initialSelEnd = outAttrs.initialSelStart = -1;
outAttrs.label = "";
outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI;
outAttrs.inputType = InputType.TYPE_NULL;
return new BaseInputConnection(this, false);
}
@Override
public boolean onCheckIsTextEditor ()
{
return true;
}
现在我可以显示键盘了:
InputMethodManager mgr = (InputMethodManager)mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(mView, 0);
按键通过视图的 onKeyUp() 和 onKeyDown() 方法得到报告。
仍然使用 hideSoftInputFromWindow() 来隐藏它