19

有没有任何方法可以显示连接USB键盘的软件键盘(在我的情况下是RFID阅读器)?
我试图迫使它使用输入管理(与这些或类似参数)显示,但没有运气即使连接了硬件键盘,也显示软键盘

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

重要通知 - 我知道,有在状态的按钮/系统栏显示它,但此按钮对用户不可见(Kiosk应用程序)。

+0

我也有同样的问题。请告诉我该怎么做。我已经应用了下面的ans代码,但仍然软键盘不能正常工作。 – 2014-02-07 11:24:38

回答

14

你需要重写InputMethodService方法onEvaluateInputViewShown(),以评估为真,即使是有硬键盘。请参阅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()自己。如果您以不同方式修改此方法,请务必记住此详细信息。

+0

简而言之 - 我需要创建自己的InputMethodService,几乎和我想创建自己的键盘布局一样,管理器将在操作系统设置等中可见。所以在我的情况下,我将使用默认键盘布局我想避开这条路径,但看起来没有其他办法,或者是否有任何“快捷方式”? – Warlock 2012-07-30 09:36:23

+0

我能想到的最佳捷径是创建自己的类MyInputMethodService extends InputMethodService,并且只覆盖onEvaluateInputViewShown ()方法,因为它们已经在超类中,所以你不必编写任何其他方法,也不需要创建自己的键盘布局f或者这个工作,作为默认的键盘或你使用android:inputType指定的键盘的任何风格仍将被使用。如果您需要它可以创建自己的特定方式,而不是通用inputTypes之一。 – 2012-07-30 16:23:01

+0

谢谢。此方法有效!我无法找到默认的Android键盘布局等位置,所以我使用SDK的示例。但是,只覆盖一种方法是相当长的方法;-) – Warlock 2012-08-01 20:34:14

1

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

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

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

这里没有任何改变:-(你还增加了哪些代码?在你的例子中,我只是将someInputView改为我的EditText,并检查imm是否为空,一切看起来都很好,但键盘没有显示出来,谢谢 – Warlock 2012-07-23 06:57:21

+2

This其中一个也不起作用 – Ehsan 2015-09-11 07:09:26

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

OR

你甚至可以建立你的:

看到example of a keyboard实施inputmethodservice.KeyboardView

你也可能想看看GingerBread Keyboard source.

+0

不工作。我已经尝试过这种“简单”的方式来显示键盘。 – Warlock 2012-08-01 10:30:11

+0

更新后,如果在你使用的android版本中实现'inputmethodservice.KeyboardView'失败,那么我认为你可能*被迫*构建你的。 – 2012-08-01 12:27:50

+0

是的,它也不适用于我。 – Ehsan 2015-09-11 07:06:35

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