Штатная экранная клавиатура в 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());
Функционал остальных кнопок реализован тоже несложно.
На данный момент клавиатура загнана из разметки в отдельный фрагмент. В связи с этим переписан метод перехода к следующему полю. Он стал даже более компактным. Блокирование стандартной клавиатуры выполнено не editText.setInputType(InputType.TYPE_NULL); а переписыванием слушателя нажатий, поскольку в последних версиях эта команда отрубала курсор.
ОтветитьУдалить// Класс слушателя касаний к полям ввода
class TouchListener implements View.OnTouchListener {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
Keyb.setVisibility(View.VISIBLE); // Установить видимость разметки
view.onTouchEvent(motionEvent);
InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
return true;
}
}
В остальном особых изменений не последовало.