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