有没有办法显示连接USB键盘的软件键盘(在我的情况下是RFID阅读器)
我试图使用InputManager(使用这些或类似的参数)强制显示它,但没有成功
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
重要通知-我知道状态/系统栏中有一个按钮可以显示它,但用户看不到这个按钮(Kiosk应用程序)
即使有硬键盘,也需要重写InputMethodService方法onEvaluateInputViewShown()才能计算为true。请参阅onEvaluateInputShown()和InputMethodService的软输入视图部分。请尝试创建自己的自定义InputMethodService类来覆盖此方法。
EDIT: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()。如果您以不同的方式修改此方法,请务必记住此细节。
软键盘在不同的平台上可能有不可预测的行为。首先在代码中,确保您有一个可编辑的输入控件。例如,如果你有一个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
或其他控件方法中添加这些事件中的任何一个。
然而,如果由于某种原因以上任何一项都失败了,您的最佳选择可能是使用替代键盘,例如指南针键盘、
OR
您甚至可以构建自己的:
请参阅实现inputmethodservice.KeyboardView
的键盘示例
你可能还想看看姜饼键盘的来源。
如果您的应用程序具有WRITE_SECURE_SETTINGS权限(可用于系统应用程序或Android Things应用程序),它可以设置show_ime_with_hard_keyboard
系统设置,即使插入了硬键盘,也会启用软键盘:
Settings.Secure.putInt(getContentResolver(), "show_ime_with_hard_keyboard", 1);
这在我的应用程序中起到了作用,有趣的是,它也是一个kiosk应用程序。
这有点剥离,我事先做了一些检查,IMM是否为null等等。
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInputFromWindow(someInputView.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
根据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();
}
}