Задать вопрос

Обработка нажатий клавиш в custom view?

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

Мне важно что бы не было текста ввода, не было выделения, копирования и прочего характерного для EditText, просто клавиатура, желательно на весь экран.
developer.android.com/training/keyboard-input/inde..., официальный источник и гугление мало что дало, и вот отчаявшись пишу вопросы сюда.


1. Как программно вызвать soft клавиатуру (методы из документации не срабатывают)?

2. Как обрабатывать нажатия на клавиши (учитывая разные языки)?

3. Можно ли растянуть клавиатуру на весь экран?
  • Вопрос задан
  • 4564 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 1
Gariks
@Gariks Автор вопроса
Метод научного тыка выручает. Клавиатуру можно вызвать к элементам TextView и его дочерним таким способом

	public void showSoftKeyboard(View view) {

		if (view.requestFocus()) {
			InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
			imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
		}

	}


При этом view.requestFocus сработает только если у элемента стоят флаги view.setFocusable(true); или view.setFocusableInTouchMode(true);, а InputMethodManager.SHOW_FORCED обеспечивает корректное переключение вида клавиатуры при изменении ориентации экрана.

Далее по порядку.
 EditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); // в альбомном виде не показывается поле ввода и прочее
 EditText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); // не показываются подсказки

^ эти действия можно выполнить и из XML файла задав нужные атрибуты, но у меня элемент генерируется программно.

Обработка нажатия клавиш ExitText.addTextChangedListener и в самом TextWatcher процедура определения клавиши реализована на afterTextChanged(Editable s) (если вы меняете Editable в процессе работы afterTextChanged вызовется снова с измененными данными). TextWatcher ловит ТОЛЬКО текстовые кнопки, например, backspace он уже не обрабатывает, возможно нужно будет внедрять onKeyListener (еще не реализовывал).

Есть еще такая интересная штука как TextView.OnEditorActionListener, но по опытам он срабатывает только тогда когда вы нажали кнопку «Готово» в альбомной ориентации клавиатуры, и не срабатывает на хадварную кнопку «назад», которая закрывает клавиатуру — получается через него не определить скрытие/закрытие клавиатуры.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
web_dev
@web_dev
1. Сейчас делаю проект, клавиатура вызывается на ура.
	private void showKeyboard() {

		InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
		imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
	}

или

	private void showKeyboard(EditText editText) {
		InputMethodManager imm = (InputMethodManager) AddPeriodActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
		imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
	}

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы