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

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

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

重要提示 – 我知道状态/系统栏中有一个button可显示,但此button对用户(Kiosk应用程序)不可见。

Solutions Collecting From Web of "即使连接了硬件键盘,也显示软键盘"

即使有硬键盘,您也需要重写InputMethodService方法onEvaluateInputViewShown()来计算true。 请参阅onEvaluateInputShown()和InputMethodService的Soft Input View部分。 尝试创build您自己的自定义InputMethodService类来覆盖此方法。

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

来源:

“覆盖这个来控制什么时候应该向用户显示软input区域,默认实现只显示没有硬键盘或者键盘被隐藏的input视图,如果你改变这个返回值,你需要调用updateInputViewShown ()自己每当返回的价值可能已经改变,重新疏散和应用。“

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

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

试试(未testing):

 public boolean onEvaluateInputViewShown() { return true; } 

由于这个返回值不会改变,你不需要自己调用updateInputViewShown()。 如果以不同的方式修改这个方法,一定要记住这个细节。

软键盘在不同的平台上可能具有不可预知的行为。 首先在你的代码中,确保你有一个可编辑的input控件。 例如,如果你有一个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或控件的其他方法中添加任何这些事件。

如果出于某种原因,上述任何一个失败,你最好的select可能是使用另一个键盘,例如指南针键盘 ,

要么

你甚至可以build立你的:

查看实现inputmethodservice.KeyboardView 的键盘 inputmethodservice.KeyboardView

你可能也想看看姜饼键盘的来源。

这在我的应用程序工作,有趣的是,也是一个自助服务terminal应用程序。

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

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

根据这个https://stackoverflow.com/a/24287780/2233069 ,我做了Kiosk模式的工作解决scheme。

 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(); } }