即使连接了硬件键盘,也显示软键盘

时间:2012-07-22 16:57:50

标签: android keyboard android-softkeyboard android-input-method kiosk-mode

有没有办法显示连接USB键盘的软键盘(在我的情况下是RFID阅读器)?
我试图使用InputManager强制显示它(带有这些或类似的参数),但没有运气

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

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

5 个答案:

答案 0 :(得分:16)

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

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

来自来源:

  

“覆盖此项以控制何时应向用户显示软输入区域。默认实现仅在没有硬键盘或键盘隐藏时显示输入视图。如果更改返回的内容,则需要每当返回的值可能已更改为重新标记并应用它时,自己调用updateInputViewShown()。“

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

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

尝试(未测试):

public boolean onEvaluateInputViewShown() {
     return true;
}

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

答案 1 :(得分: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

你甚至可以建立自己的

查看实施example of a keyboard

inputmethodservice.KeyboardView

您可能还想查看GingerBread Keyboard source.

答案 2 :(得分:0)

这在我的应用程序中有用,有趣的是,也是一个自助服务终端应用程序。

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

((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInputFromWindow(someInputView.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

答案 3 :(得分:0)

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

Settings.Secure.putInt(getContentResolver(), "show_ime_with_hard_keyboard", 1);

答案 4 :(得分:-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();
        }
}