36

showSoftInput()不会为我显示键盘,但toggleSoftInput()会显示。我看到其他一些帖子说在使用模拟器时禁用硬键盘,但我没有使用模拟器。我正在没有硬键盘的实际设备上加载我的 APK。两种方法都不应该有效吗?为什么不起作用showSoftInput()?我想明确地将键盘与特定的文本字段相关联。

不起作用:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
editText.setText("textchange"); //i see the text field update
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

作品:

InputMethodManager imm = (InputMethodManager) getDelegate().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
4

8 回答 8

26

似乎键盘最初显示但被其他东西隐藏了,因为以下工作(但实际上是一个肮脏的解决方法):

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
editText.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        editText.requestFocus();
        imm.showSoftInput(editText, 0);
    }
}, 100);

在查看 logcat 时,我怀疑此消息背后的原因隐藏了最初显示的键盘:

在开始输入时隐藏剪贴板对话框:由其他人完成...!

于 2013-05-19T20:57:44.253 回答
5

显示键盘+焦点,如果你想隐藏键盘

@Override
public void onResume () {
    super.onResume();

    inputSearch.setFocusableInTouchMode(true);
    inputSearch.requestFocus();

    // Show Keyboard
    InputMethodManager imm = (InputMethodManager) getSherlockActivity().getSystemService(
            Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(inputSearch, InputMethodManager.SHOW_IMPLICIT);
}

PS inputSearch = (EditText) getSherlockActivity().findViewById(R.id.inputSearch);

    // Hide Keyboard
InputMethodManager imm = (InputMethodManager) getSherlockActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(inputSearch.getWindowToken(), 0);
于 2013-07-18T05:42:21.627 回答
5

如果 imm 的目标视图与 editText 相同,则 ShowSoftInput 有效。您可以通过imm.isActive(editText)或进行检查editText.isInputMethodTarget()

ToggleSoftInput 只是切换 imm 当前目标的键盘。

imm 的目标视图是在焦点更改后设置的editText.requestFocus()。我认为这两个任务之间存在一些后期处理,因为一个可运行的后期是不够的。我测试了双张贴,它对我有用。

editText.requestFocus();
editText.post(new Runnable() {
    @Override
    public void run() {
        editText.post(new Runnable() {
            @Override
            public void run() {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null) {
                    imm.showSoftInput(editText, 0);
                }
            }
        });
    }
});
于 2018-03-02T18:04:38.377 回答
2

这个问题的确切答案为什么 showSoftInput 不起作用而 toggleSoftInput 起作用?

是您尝试显示键盘的视图没有焦点。因此,要解决这个问题并使用showSoftInput方法,您必须在视图中调用以下方法:

  setFocusable(true);
  setFocusableInTouchMode(true); 

调用上述方法将确保当您单击 View 时保留并捕获焦点。

于 2013-07-08T15:58:57.983 回答
2

当设备具有硬(滑出)键盘时,showSoftInput() 不起作用

带有 showSoftInput 的 Android 显示软键盘不起作用?

于 2013-08-06T14:52:18.943 回答
1
public void hideKeyboard() {
    myTextView.setFocusable(true);
    myTextView.setFocusableInTouchMode(true);
    imm.hideSoftInputFromWindow(myTextView.getWindowToken(), 0);
}

作品

public void hideKeyboard() {
    imm.hideSoftInputFromWindow(myTextView.getWindowToken(), 0);
}

不工作

imm 在我使用 Fragment 时已被较早处理,因此:

在 Fragment 中声明 imm

private InputMethodManager imm;

然后在片段中添加:

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    imm = (InputMethodManager)
    getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
}

他说经过 3 到 4 个小时的研究和失败!

感谢 user_CC !:-)

菲尔

于 2014-09-17T18:30:58.183 回答
1

尝试这个:

public void showTheKeyboard(Context context, EditText editText){
    InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}

如果这不起作用,请从此处阅读教程

于 2012-12-04T08:47:10.050 回答
0

我知道这篇文章已经很老了,但是对于那些从这个日期开始寻求答案并且上述方法都不起作用的人。当弹出警报对话框时,下面的代码在 Activity 上为我工作。

InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

显示键盘:

keyboard.toggleSoftInput(editText.getPaintFlags(), 0);

隐藏键盘:

keyboard.hideSoftInputFromWindow(editText.getWindowToken(), 0);
于 2020-12-07T20:38:25.097 回答