23

有什么方法可以显示连接了 USB 键盘的软件键盘(在我的情况下是 RFID 阅读器)?
我尝试使用 InputManager (使用这些或类似参数)强制显示它,但没有运气

((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

重要通知- 我知道状态/系统栏中有一个按钮可以显示它,但用户(Kiosk 应用程序)看不到这个按钮。

4

5 回答 5

18

即使有硬键盘,您也需要覆盖 InputMethodService 方法 onEvaluateInputViewShown() 以评估为 true。请参阅onEvaluateInputShown()和InputMethodService的软输入视图部分。尝试创建您自己的自定义 InputMethodService 类来覆盖此方法。

编辑:onEvaluateInputShown() 的来源应该有所帮助。解决方案应该像创建您自己的扩展 InputMethodService 的类并覆盖这个方法一样简单,该方法只有几行长。确保也将您的自定义服务添加到您的清单中。

来源:

"覆盖这个来控制何时应该向用户显示软输入区域。默认实现只在没有硬键盘或键盘被隐藏时显示输入视图。如果你改变这个返回的内容,你需要调用 updateInputViewShown () 每当返回的值可能已更改以重新评估和应用它时您自己。”

public boolean onEvaluateInputViewShown() {
     Configuration config = getResources().getConfiguration();
     return config.keyboard == Configuration.KEYBOARD_NOKEYS
             || config.hardKeyboardHidden == Configuration.KEYBOARDHIDDEN_YES;
}

以下是您可以检查的可能配置。Configuration.KEYBOARD_NOKEYS 对应无硬件键盘。如果没有硬件键盘或隐藏了硬件键盘,此方法返回 true(应显示软键盘)。删除这两项检查并简单地返回 true 应该会使软件键盘可见,即使连接了硬件键盘也是如此。

尝试(未测试):

public boolean onEvaluateInputViewShown() {
     return true;
}

由于此返回值不会更改,因此您无需自己调用 updateInputViewShown()。如果您以不同方式修改此方法,请务必记住此详细信息。

于 2012-07-24T18:18:14.137 回答
2

软键盘在不同平台上可能具有不可预知的行为。首先在您的代码中,确保您有一个可编辑的输入控件。例如,如果你有一个 EditText,你可以使用:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE))
    .showSoftInput(myEditText, InputMethodManager.SHOW_FORCED);

但是,您可以随时显示和隐藏它:

//show keyboard:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//hide keyboard :
 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

OnCreate您还可以在控件内部或其他一些方法中添加任何这些事件。

但是,如果由于某种原因上述任何一项失败,您最好的选择可能是使用替代键盘,例如Compass Keyboard

或者

你甚至可以构建你的:

请参阅实现的键盘示例inputmethodservice.KeyboardView

您可能还想查看GingerBread 键盘源。

于 2012-07-30T15:51:11.487 回答
1

如果您的应用程序具有WRITE_SECURE_SETTINGS权限(适用于系统应用程序或 Android Things 应用程序),它可以设置show_ime_with_hard_keyboard系统设置,即使插入硬键盘也将启用软键盘:

Settings.Secure.putInt(getContentResolver(), "show_ime_with_hard_keyboard", 1);
于 2019-08-01T12:11:32.503 回答
0

这在我的应用程序中有效,有趣的是,这也是一个信息亭应用程序。

这有点剥离,我事先做了一些检查,IMM 是否为空等等。

((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInputFromWindow(someInputView.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
于 2012-07-22T17:09:05.593 回答
-1

根据此https://stackoverflow.com/a/24287780/2233069,我为 Kiosk 模式制定了工作解决方案。

boolean hardwareKeyboardPlugged=false;

....

mEditText.setOnFocusChangeListener(this);//in onCreate()

....

@Override
public void onResume() {
    //protect from barcode scanner overriding keys
    hardwareKeyboardPlugged=(getResources().getConfiguration().hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO);

    super.onResume();
}

....

@Override
public void onFocusChange(View v, boolean hasFocus) {
    if (hasFocus)
        if (hardwareKeyboardPlugged){
            //protect from barcode scanner overriding keys
            hardwareKeyboardPlugged=false;
            ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).showInputMethodPicker();
            Toast.makeText(this, "USB device detected. Turn OFF hardware keyboard to enable soft keyboard!", Toast.LENGTH_LONG).show();
        }
}
于 2016-07-19T19:46:46.663 回答