Готовимся к Windows 11: добавляем поддержку полноценной клавиатуры в Android-приложение
Многие мобильные приложения уже могут конкурировать с полноценными десктопными версиями, а иногда и превосходить их. Офисные пакеты, фоторедакторы и IDE вполне неплохо работают на портативных девайсах. Samsung, например, даже сделал специальный режим DeX Mode, который позволяет подключить к смартфону монитор и периферию.
А скорый релиз Windows 11 с возможностью устанавливать любые APK-файлы прямо намекает, что пора озаботиться поддержкой десктопных режимов в своих мобильных приложениях. Один из шагов к этому — добавить полноценную поддержку клавиатуры, чем сегодня и займёмся.
Под катом разберём навигацию по RecyclerView, привязку горячих клавиш к toolbar menu, добавим кастомные сочетания и покажем пользователям, как ими пользоваться.
Навигация по RecyclerView
Google в RecyclerView (в отличие от ListView) не стал добавлять нативную поддержку клавиатур и D-падов для навигации, поэтому придётся добавлять её самим.
Реализация навигации во многом зависит от используемого layout-менеджера, наличия фокусируемых вьюх (focusable views) в списке, возможности мультивыбора и других деталей. Но базовый подход не поменяется. Для добавления поддержки клавиатуры в RecyclerView нужно только дополнить адаптер, не затрагивая остальную часть приложения.
Просто регистрируем OnKeyListener в адаптере на прикрепленном списке, чтобы начать принимать нажатия кнопок:
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
super.onAttachedToRecyclerView(recyclerView)
recyclerView.setOnKeyListener{_, keyCode, event->
if (event.action!= KeyEvent.ACTION_DOWN) {
return@setOnKeyListener false
}
when (keyCode) {
KeyEvent.KEYCODE_DPAD_DOWN-> selectNext(recyclerView)
KeyEvent.KEYCODE_DPAD_UP-> selectPrevious(recyclerView)
else -> return@setOnKeyListener false
}
return@setOnKeyListener true
}
}
Сложность реализации методов selectNext () и selectPrevious () зависит целиком от ваших пожеланий. В общем случае всё сводится к:
private fun selectNext(recyclerView: RecyclerView) {
val oldSelectedPosition = selectedPosition
selectedPosition = if (selectedPosition.isLast()) {
0
} else {
selectedPosition + 1
}
notifyItemChanged(selectedPosition)
notifyItemChanged(oldSelectedPosition)
recyclerView.smoothScrollToPosition(selectedPosition)
}
Горячие клавиши для toolbar menu
Пожалуй, наиболее простой способ добавить шорткаты в приложение — использовать атрибуты android: alphabeticShortcut и android: numericShortcut в ваших