пятница, 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());

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

понедельник, 23 июня 2014 г.

Устранение непредсказуемого поведение веса (layout:weight) при разметке активности

layout:weight
 
Настройки веса при разметки активности реализованы на Android не очень прозрачно. Я долго мучился с непонятными скачками размеров и вылетами элементов за пределы разметки, пока не плюнул на интуицию и не изучил рекомендуемые правила их настройки.

Итак, у вас не получится чётко управлять весом элементов, пока вы в свойстве layout:width не установите значение ширины элемента в ноль вместо match_parent или wrap_content.

Замечу, что настройки подразделяются на обычные и с приставкой layout. Обычные настройки влияют на содержимое внутри элемента. Настройки с приставкой layout влияют на внешние размеры элемента и его положение во внешнем контейнере.

суббота, 21 июня 2014 г.

Error:Cause: failed to find Build Tools revision...

Обновился на днях через SDK Manager, и при открытии старого проекта вывалилась ошибка:

Error:Cause: failed to find Build Tools revision 19.0.3
Please install the missing Build Tools from the Android SDK Manager.

Но возвращать старый Build Tools мне как-то не хотелось.

Решение оказалось предсказуемо - надо открыть внутри папки модуля уже знакомый нам файл build.gradle и поменять в нём номер текущей версии на свежий:

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"


    // Остальные настройки
}

Решение нашёл тут:
http://stackoverflow.com/questions/21353832/failed-to-build-project-with-android-studio