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

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

Есть ли способ показать клавиатуру программного обеспечения с подключенной USB-клавиатурой (в моем случае RFID-считыватель)?
Я попытался показать это с помощью InputManager (с этими или подобными параметрами), но не повезло

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

Важное уведомление. Я знаю, что есть кнопка в статусной/системной панели, чтобы показать ее, но эта кнопка не отображается пользователю (приложение Kiosk).

4b9b3361

Ответ 1

Вам необходимо переопределить метод InputMethodService onEvaluateInputViewShown(), чтобы оценить значение true даже при наличии жесткой клавиатуры. См. onEvaluateInputShown() и раздел "Просмотр мягкого ввода" InputMethodService. Попробуйте создать свой собственный класс InputMethodService, чтобы переопределить этот метод.

EDIT: источник для onEvaluateInputShown() должен помочь. Решение должно быть таким же простым, как создание собственного класса, который расширяет InputMethodService и отменяет этот метод, который составляет всего пару строк. Обязательно добавьте свою собственную службу в свой манифест.

От источника:

"Переопределите это, чтобы управлять, когда область мягкого ввода должна отображаться пользователю. Реализация по умолчанию показывает только представление ввода, когда нет жесткой клавиатуры или клавиатура не скрыта. Если вы измените то, что это вернет, вам понадобится для вызова 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() самостоятельно. Если вы измените этот метод по-разному, обязательно запомните эту деталь.

Ответ 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.

Ответ 3

Это работало в моем приложении, интересно, также приложение для киоска.

Это немного лишено, я сделал некоторые проверки заранее, является ли IMM нулевым и тому подобное.

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

Ответ 4

в соответствии с этим fooobar.com/info/225768/..., я создал рабочее решение для режима киоска.

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