Intereting Posts
Android Architecture Design – Как это сделать правильно? Как отключить onCreate действие при изменении ориентации? Android – как удалить вид линейного макета Сделать телефонную кнопку звонка на веб-странице Android Создайте (повторяющийся высокий шаг) Тревога на дистанционном триггере, когда приложение не работает (iphone / android), как Find My iPhone В результате произошло просочившееся окно, которое было первоначально добавлено Как нарисовать форму волны музыкального плеера Android? BufferedReader не считывает все строки из файла Как получить пароли всех учетных записей в Android? Как печатать / регистрировать адрес переменной в NDK Gradle для Android AAR в зависимости от AAR, оба в одном удаленном репозитории? Поддержка Admob для Kivy (Python для Android) Ошибка: поддерживаются только автономные исполняемые файлы (PIE) Ошибка несоответствия тегов – студия Android Как скрыть курсор Bubble на EditText?

Создание SoftKeyboard с несколькими / альтернативными символами на ключ

Я следил за примерами на developer.android.com относительно методов ввода и играл с образцом приложения SoftKeyboard . Они дают более чем достаточно информации о создании простой клавиатуры.

То, что я не вижу в API, – это возможность создавать альтернативные / множественные символы для каждого ключа, который доступен на стандартной клавиатуре (LatinIME Keyboard).

Введите описание изображения здесь

Вышеупомянутое изображение является результатом длительного нажатия клавиши «a». Когда вы долго нажимаете клавишу, вы можете заполнить всплывающее окно с помощью альтернативных символов.

Введите описание изображения здесь

Также можно дать подсказку всплывающих окон на некоторых клавишах, которые заставят пользователя нажать и удерживать клавишу, чтобы получить всплывающее меню.

До сих пор я не нашел ни одного источника информации о том, как это достигается, надеюсь, кто-то сможет дать мне начало, до тех пор я буду следовать исходному коду встроенной клавиатуры и посмотреть, могу ли я перепроектировать Это.

Редактировать: Помогло бы, если ссылка разработчика.android.com на латинскую клавиатуру не ссылалась на изображение овечки 🙂 Фактический исходный код для LatinIME.java .

Редактирование 2: больше, чем ссылка, чем любая другая, это последовательность, в которой, как я полагаю, выполняется обычное действие longPress, чтобы показать всплывающее меню в KeyboardView.java :

onTouchEvent() onModifiedTouchEvent() mHandkler.handleMessage() with MSG_LONGPRESS openPopupIfRequired() onLongPress() 

Редактировать 3:

Я до сих пор не понял этого: как добавить предложения ярлыков к клавишам? Ответ подсказывает, что он не встроен в API, и, действительно, я не нашел этот код. Однако на клавиатуре 2.3.4 (API 10) показана реализация этой функции:

Введите описание изображения здесь

Очень хотелось бы выяснить, как это делается, но это не везде, где я могу видеть метод onDraw() , который заставляет меня думать, что он написан за пределами элемента KeyboardView. Однако я не могу найти файл layout используемый для отображения элемента KeyboardView на встроенной клавиатуре. Если кто-нибудь знает, где его найти, возможно, это даст мне ключ, который мне нужен.

Редактировать 4: Перемещенная клавиша Предварительный просмотр здесь, так как он слегка отключен от темы:

Как отключить окно предварительного просмотра клавиатуры SoftKeyboard?

    Внедрение альтернативного всплывающего окна:

    Для каждого ключа вы хотите иметь всплывающее меню, вы должны определить popupCharacters и popupKeyboard :

    /res/xml/[Keyboard].xml

     <Key android:keyLabel="(" android:popupKeyboard="@xml/keyboard_popup_template" android:popupCharacters="[{&lt;" /> 

    popupKeyboard представляет собой XML-представление клавиатуры, используемой во всплывающем меню, содержащем альтернативные ключи:

    /res/xml/keyboard_popup_template.xml

     <Keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:keyWidth="10%p" android:horizontalGap="0px" android:verticalGap="0px" android:keyHeight="56dp"> </Keyboard> 

    Создание альтернативного всплывающего окна:

    Если вы хотите изменить макет / стиль всплывающего окна (по умолчанию это @android: layout / keyboard_popup_keyboard.xml ), вы можете указать атрибут android:popupLayout который указывает на файл макета:

     <android.inputmethodservice.KeyboardView android:id="@+id/keyboard" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="#FF272727" android:popupLayout="@layout/keyboard_popup_keyboard" /> 

    Выполнение наложения предварительного просмотра ключей:

    Единственное решение, которое я смог сбить вместе, чтобы показать ключевые предварительные просмотры (без полной перезаписи исходного кода KeyboardView), приведен ниже:

    Обертка <KeyboardView> с помощью <FrameLayout> с высотой, указанной умножением keyHeight на количество строк. Внутри этого тега я просто создал LinearLayout для хранения строк, а затем LinearLayout для каждой строки, содержащей TextView с весом, равным значению% p, указанному для каждого <Key> :

     <TextView android:text="!" style="@style/Custom.Widget.KeyboardKeyOverlay" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="10"/> 

    И стиль:

     <style name="CustomTheme.Widget.KeyboardKeyOverlay"> <item name="android:background">@android:color/transparent</item> <item name="android:textColor">#FFAAAAAA</item> <item name="android:paddingRight">6dp</item> <item name="android:paddingTop">4dp</item> <item name="android:textSize">10sp</item> <item name="android:gravity">right</item> <item name="android:textStyle">bold</item> </style> 

    Что производит это:

    Введите описание изображения здесь

    Я не буду счастлив, пока не смогу реализовать это так же, как это делает System Keyboard!

    Судя по моей собственной попытке кодирования программной клавиатуры, я узнал, что:

    • Для Nice / bling обычно требуется, чтобы вы расширили KeyboardView и в основном пишете большие части кода чертежа. К сожалению, вы не можете сделать это, переопределив некоторые ключевые методы, поскольку почти все является частным. Возможно, вам захочется взглянуть (и заимствовать код из:
      • (base)/core/java/android/inputmethodservice/KeyboardView.java ( (base)/core/java/android/inputmethodservice/KeyboardView.java кода ядра Android)
      • (apps)/other/LatinIME/LatinKeyboardView.java ( (apps)/other/LatinIME/LatinKeyboardView.java приложений Android)

    Обратите внимание, что овец на android.kernel.org должен сказать вам, что репо закрыто из-за взломщиков, но есть зеркала кода в другом месте (к сожалению, потеряли ссылки)

    • Базовый KeyboardView не поддерживает оттенки ключевых подсказок, вы должны закодировать свой собственный KeyboardView, чтобы получить возможность переопределить метод onDraw ().

    Теперь о том, что вы можете сделать:

    • Вы можете решить эту проблему, предоставив картинки для ключей: используйте xml <Key ... android:keyIcon="@drawable/this_key_icon_file /> для этого. К сожалению, у вас наверняка будут плохие результаты для писем с помощью этого метода (разрешение вопросы).

    • Вы можете использовать (и настраивать внешний вид) всплывающей клавиатуры, которая появляется при длительном нажатии.

    Объявите шаблон клавиатуры res/xml/kbd_popup_template.xml :

     <Keyboard xmlns:android="http://schemas.android.com/apk/res/android" android:keyWidth="10%p" android:horizontalGap="0px" android:verticalGap="0px" android:keyHeight="@dimen/key_height"> </Keyboard> 

    Объявите строковые значения, содержащие нужные ключи на этой клавиатуре res/values/strings.xml :

     <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="alternates_for_a">àáâãäåæ</string> </ressources> 

    Затем используйте как в определении раскладки клавиатуры:

     <Key android:codes="97" android:keyLabel="a" android:popupKeyboard="@xml/kbd_popup_template" android:popupCharacters="@string/alternates_for_a" /> 
    • Вы также можете использовать функцию двойного касания, тройного касания, … для генерации альтернатив для ключа, который вы используете. Для этого просто используйте список для кодов клавиш Android:

      <Key android:codes="97,224,230" .../>

    Будет производить 97 = ' a ' для одного крана, 224 = ' à ' для двойного касания и 230 = ' æ ' для тройного крана.

    Продолжительность рассмотрения двойного нажатия – 800 мс в исходном коде Android. К сожалению, он жестко запрограммирован (и я немного чувствую себя).

    Имейте в виду, что при двойном постукивании он в основном отправляет « a » первым, а затем на втором касании посылает « à ». Некоторым приложениям это не понравится.

    Эта всплывающая клавиатура с кнопкой закрытия раздражает, когда у нас есть только один всплывающий символ. Более простой способ – переопределить метод onLongPress класса KeyboardView следующим образом.

     @Override protected boolean onLongPress(Key key) { if (key.codes[0] == '1') { getOnKeyboardActionListener().onKey('!', null); return true; } } 

    Если вы хотите иметь текст поверх своего ключа, вы можете сделать это в методе onDraw () в своем классе, который переопределяет KeyboardView

      @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); ... Paint paint = new Paint(); paint.setTextAlign(Paint.Align.CENTER); paint.setTextSize(18); paint.setColor(Color.WHITE); //get all your keys and draw whatever you want List <Key> keys = getKeyboard().getKeys(); for(Key key: keys) { if(key.label != null) { if (key.label.toString().equals("q") || key.label.toString().equals("Q")) canvas.drawText(String.valueOf(1), key.x + (key.width / 2) + 10, key.y + 25, paint); else if (key.label.toString().equals("w") || key.label.toString().equals("W")) canvas.drawText(String.valueOf(2), key.x + (key.width / 2) + 10, key.y + 25, paint); else if (key.label.toString().equals("e") || key.label.toString().equals("E")) canvas.drawText(String.valueOf(3), key.x + (key.width / 2) + 10, key.y + 25, paint); else if (key.label.toString().equals("r") || key.label.toString().equals("R")) canvas.drawText(String.valueOf(4), key.x + (key.width / 2) + 10, key.y + 25, paint); else if (key.label.toString().equals("t") || key.label.toString().equals("T")) canvas.drawText(String.valueOf(5), key.x + (key.width / 2) + 10, key.y + 25, paint); else if (key.label.toString().equals("y") || key.label.toString().equals("Y")) canvas.drawText(String.valueOf(6), key.x + (key.width / 2) + 10, key.y + 25, paint); else if (key.label.toString().equals("u") || key.label.toString().equals("U")) canvas.drawText(String.valueOf(7), key.x + (key.width / 2) + 10, key.y + 25, paint); else if (key.label.toString().equals("i") || key.label.toString().equals("I")) canvas.drawText(String.valueOf(8), key.x + (key.width / 2) + 10, key.y + 25, paint); else if (key.label.toString().equals("o") || key.label.toString().equals("o")) canvas.drawText(String.valueOf(9), key.x + (key.width / 2) + 10, key.y + 25, paint); else if (key.label.toString().equals("p") || key.label.toString().equals("P")) canvas.drawText(String.valueOf(0), key.x + (key.width / 2) + 10, key.y + 25, paint); else {} } } } 

    Для тех, кто пытается отклонить всплывающее меню, нажав за пределы области просмотра, мне посчастливилось положить TouchListener в KeyboardView внутри класса, расширяющего InputMethodService

     public class YourIME extends InputMethodService{ @Override public View onCreateInputView() { mInputView = (LatinKeyboardView) getLayoutInflater().inflate(R.layout.input, null); setLatinKeyboard(mQwertyKeyboard); mInputView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { if(motionEvent.getAction() == MotionEvent.ACTION_DOWN) { mInputView.closing(); // Close popup keyboard if it's showing } return false; } }); return mInputView; } // The rest of your ime ... }