пятница, 27 июня 2014 г.

Встроенная в программу цифровая клавиатура

Штатная экранная клавиатура в 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());

Функционал остальных кнопок реализован тоже несложно.

1 комментарий:

  1. На данный момент клавиатура загнана из разметки в отдельный фрагмент. В связи с этим переписан метод перехода к следующему полю. Он стал даже более компактным. Блокирование стандартной клавиатуры выполнено не 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;
    }
    }

    В остальном особых изменений не последовало.

    ОтветитьУдалить