有没有办法显示连接USB键盘的软键盘(在我的情况下是RFID阅读器)?
我试图使用InputManager强制显示它(带有这些或类似的参数),但没有运气
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
重要提示 - 我知道状态/系统栏中有一个按钮可以显示它,但用户看不到此按钮(Kiosk应用)。
答案 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,
或强> 的
你甚至可以建立自己的
的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();
}
}