23

USBキーボードが接続されたソフトウェアキーボード(私の場合はRFIDリーダー)を表示する方法はありますか?
InputManagerを使用して(これらまたは同様のパラメーターを使用して)強制的に表示しようとしましたが、うまくいきませんでした

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

重要なお知らせ-ステータス/システムバーに表示するボタンがあることは知っていますが、このボタンはユーザーには表示されません(キオスクアプリ)。

4

5 に答える 5

18

ハードキーボードがある場合でもtrueと評価するには、InputMethodServiceメソッドonEvaluateInputViewShown()をオーバーライドする必要があります。onEvaluateInputShown()およびInputMethodServiceのソフト入力ビューセクションを参照してください。このメソッドをオーバーライドするには、独自のカスタムInputMethodServiceクラスを作成してみてください。

編集:onEvaluateInputShown()のソースが役立つはずです。解決策は、InputMethodServiceを拡張する独自のクラスを作成し、数行しかないこの1つのメソッドをオーバーライドするのと同じくらい簡単である必要があります。マニフェストにもカスタムサービスを追加してください。

ソースから:

「これをオーバーライドして、ソフト入力領域をユーザーに表示するタイミングを制御します。デフォルトの実装では、ハードキーボードがないか、キーボードが非表示になっている場合にのみ入力ビューが表示されます。これを変更する場合は、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()を自分で呼び出す必要はありません。このメソッドを別の方法で変更する場合は、この詳細を忘れないでください。

于 2012-07-24T18:18:14.137 に答える
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これらのイベントのいずれかを、コントロールの内部またはその他のメソッドに追加することもできます。

ただし、何らかの理由で上記のいずれかが失敗した場合は、コンパスキーボードなどの代替キーボードを使用するのが最善の方法です。

また

あなたもあなたのものを作ることができます:

を実装するキーボードの例を参照してくださいinputmethodservice.KeyboardView

GingerBreadキーボードのソースも確認することをお勧めします。

于 2012-07-30T15:51:11.487 に答える
1

アプリにWRITE_SECURE_SETTINGS権限(システムアプリまたはAndroid Thingsアプリで使用可能)がshow_ime_with_hard_keyboardある場合、ハードキーボードが接続されている場合でもソフトキーボードを有効にするシステム設定を設定できます。

Settings.Secure.putInt(getContentResolver(), "show_ime_with_hard_keyboard", 1);
于 2019-08-01T12:11:32.503 に答える
0

これは私のアプリ、興味深いことにキオスクアプリでも機能しました。

これは少し削除されています。IMMがnullかどうかなど、事前にいくつかのチェックを行いました。

((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInputFromWindow(someInputView.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
于 2012-07-22T17:09:05.593 に答える
-1

このhttps://stackoverflow.com/a/24287780/2233069によると、私はキオスクモードの実用的なソリューションを作成しました。

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();
        }
}
于 2016-07-19T19:46:46.663 に答える