Штатная экранная клавиатура в Android занимает слишком много места. Да и имеющиеся альтернативы редко бывают компактными. Между тем, существует ряд задач, где количество кнопок на клавиатуре можно существенно ограничить. Например, сейчас я пишу приложение, помогающее рассчитывать электрику в СНТ, и выезжающая в пол-экрана цифровая клавиатура, закрывающая половину полей ввода, меня категорически не устроила.
Тогда я разработал вот такую двухстрочную клавиатуру, где присутствуют только нужные в этой активности кнопки: 0-9, десятичная точка, кнопки перемещения курсора влево-вправо, забой и табуляция (переход к следующему полю ввода):
Реализована клавиатура очень просто. На корневом вертикальном LinearLayout размещены scrollView (с layout:weight = 1) и вертикальный LinearLayout, в котором и построена клавиатура.
Для всех полей отключена экранная клавиатура командой:
editText.setInputType(InputType.TYPE_NULL);
и спрятан LinearLayout с клавиатурой командой:
linearLayout.setVisibility(View.GONE);
При касании поля вызывается команда:
linearLayout.setVisibility(View.VISIBLE);
и клавиатура вызывается.
При нажатии аппаратной кнопки "Назад" вызывается команда прятать клавиатуру, если она видна. Это реализовано переопределением соответствующего метода:
@Override public void onBackPressed() { if (linearLayout.getVisibility() == View.VISIBLE) linearLayout.setVisibility(View.GONE); else super.onBackPressed(); }
На каждую кнопку подключена вибра. Для этого в разметке кнопки оказан атрибут:
android:hapticFeedbackEnabled="true"
А при нажатии на кнопку вызывается:
button,performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
Впечатывание символов в поля ввода в позицию курсора при нажатии на цифровые кнопки осуществляется следующими командами:
String textToInsert = "1"; int start = Math.max(editTetxt.getSelectionStart(), 0); int end = Math.max(editTetxt.getSelectionEnd(), 0); editTetxt.getText().replace(Math.min(start, end), Math.max(start, end), textToInsert, 0, textToInsert.length());
Функционал остальных кнопок реализован тоже несложно.