Подтвердить что ты не робот

Как я могу показать мягкую клавиатуру в веб-браузере при подключенном USB-HID-устройстве при нажатии кнопки и фокусировке ввода?

У меня есть USB-сканер штрих-кода, который подключен к устройству с USB OTG. Поскольку это выбирается как устройство HID клавиатуры, мягкая клавиатура отключается, когда входы сфокусированы.

В настоящее время у меня есть метод, который запускает клавиатуру из JavaScript.

class JsObject {
    @JavascriptInterface
    public void InvokeKeyboard() {
        InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(findViewById(R.id.webView), InputMethodManager.SHOW_FORCED);
    }
}

webview.addJavascriptInterface(new JsObject(), "Android");

В основном я хочу, чтобы он открыл клавиатуру в следующем действии внутри webview.

const button = document.querySelector('.fire-keyboard');
button.addEventListener('click', () => Android.InvokeKeyboard());

Он работает при вызове из веб-браузера вручную, но я хочу, чтобы можно было нажать кнопку, которая запускает его, и нажатие кнопки теряет фокус ввода.

Чтобы добавить, я не хочу, чтобы клавиатура отображалась при фокусировке окна ввода, только чтобы показать, когда нажата кнопка, чтобы вызвать ее. По умолчанию он отображается в фокусе.

4b9b3361

Ответ 1

Я не могу проверить это прямо сейчас, но вы можете просто использовать javascriptinterface для вызова этого:

InputMethodManager imeManager = (InputMethodManager) getApplicationContext().getSystemService(INPUT_METHOD_SERVICE);
imeManager.showInputMethodPicker();

СЛЕДУЕТ открыть диалог с текущими клавиатурами (устройством ввода). Поскольку bluetooth-сканер заменяет текущую клавиатуру, я не уверен, что вы можете отобразить экранную панель.

Используя тот же метод, пользователь при необходимости переключится обратно на сканер.

Я попробую, когда я вернусь домой, через 6 или 7 часов, но не смог попробовать себя;)

Ответ 2

Оказывается, мне просто нужно было переключиться на это оборудование.

введите описание изображения здесь

Ответ 3

Возможно, это связано с устройством, которое вы используете. Я сделал образец в соответствии с вашим сценарием и успешно выполнил его на устройстве Nexus5, которое я использую.

Просто используйте document.getElementById("mytextfield").focus(); в JS-коде, который сделал трюк.

Пример html-кода

<!DOCTYPE html>
<html>
<head>
</head>

<body>

<form name="myform">
<input type="text" id="mytextfield">
</form>

<input type="button" value="Click Me!" onClick="executeAndroidCode()" />

<script type="text/javascript">
    function executeAndroidCode() {
        Android.execAndroid();
        document.getElementById("mytextfield").focus(); //this line did the trick after click on button
    }
</script>

</body>

</html>

Сохраните этот файл в актив с именем index.html

JavaScriptInterface

public class WebAppInterface 
    {
        Context mContext;

        /** Instantiate the interface and set the context */
        WebAppInterface(Context c) {
            mContext = c;
        }

        @JavascriptInterface
        public void execAndroid() {
            InputMethodManager inputMethodManager = (InputMethodManager)
                    getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.showSoftInput(findViewById(R.id.webView1), 
                    InputMethodManager.SHOW_FORCED);
        }
    }

onCreate Code

WebView wv = (WebView) findViewById(R.id.webView1);
        wv.addJavascriptInterface(new WebAppInterface(this), "Android");

        WebSettings webSettings = wv.getSettings();
        webSettings.setJavaScriptEnabled(true);

        wv.loadUrl("file:///android_asset/index.html");

Его работая отлично на моей стороне, я использую Nexus5. Хотя курсор не отображается в скриншоте, но он мигает, когда я запускаю приложение.

введите описание изображения здесь

Ответ 4

Try this 

inputBox.setOnFocusChangeListener(new OnFocusChangeListener() {
   @Override
   public void onFocusChange(View v, boolean hasFocus) {
      if(hasFocus) {
         getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
      }
   }
});