Автоматический ввод заглавных букв в пользовательской клавиатуре Android, когда пользователь перемещает курсор в начало предложения

Я новичок в программировании Android и учусь создавать собственную клавиатуру для Android из примеров ХакерыКлавиатура и SoftKeyboard. Я столкнулся с проблемой автоматического ограничения и понятия не имею, как это преодолеть: когда пользователь нажимает где-нибудь на экране ввода, чтобы переместить курсор в начальную точку предложения, клавиатура должна автоматически перемещаться.

Пример: Во-первых, это приговор. Во-вторых, это тоже приговор. В-третьих, это тоже приговор. Когда пользователь нажимает на начало «Секунды» (после точки и пробела от первого предложения), клавиатура должна сдвигаться автоматически.

Для нормального набора текста, когда пользователь достигает конца предложения (отмеченного разделителем предложений, например точкой или вопросительным знаком), я делаю это с помощью кода ниже в методе onKey (в основном классе, который расширяет InputMethodService):

@Override
public void onKey(int primaryCode, int[] keyCodes) {
    InputConnection ic = getCurrentInputConnection();
    switch(primaryCode){
        case Keyboard.KEYCODE_DELETE :
            CharSequence selectedText = ic.getSelectedText(0);
            if (TextUtils.isEmpty(selectedText)) {
                ic.deleteSurroundingText(1, 0);
            } else {
                ic.commitText("", 1);
            }
            break;
        case Keyboard.KEYCODE_SHIFT:
            bCaps = !bCaps;
            myKeyboard.setShifted(bCaps);
            myKeyboardView.invalidateAllKeys();
            break;
        case Keyboard.KEYCODE_DONE:
            ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
            break;
        default:
            char code = (char)primaryCode;
            if (Character.isLetter(code) && bCaps){
                code = Character.toUpperCase(code);
            }
            ic.commitText(String.valueOf(code),1);

            //--------------------------------------------
            //Detect end of a sentence then shift keyboard.
            //This is not done yet. It should turned back to lower after typing first letter of sentence.
            //--------------------------------------------
            CharSequence lastTwo = ic.getTextBeforeCursor(2, 0);
            if (lastTwo == null || lastTwo.length()<=0 ||
               (lastTwo.charAt(1) == ASCII_SPACE && isSentenceSeparator(lastTwo.charAt(0)))) {
                bCaps = true;
                myKeyboard.setShifted(bCaps);
                myKeyboardView.invalidateAllKeys();
            }
    }
}

Я не смог найти ни одной части образца ХакерыКлавиатура и SoftKeyboard, относящейся к этому вопросу автоматического ограничения. Любая помощь действительно приветствуется. Огромное спасибо.

Обновлено: это не похоже на Использование заглавных букв для EditText. Пользовательская клавиатура Android работает на уровне обслуживания и в основном нацелена на глобальную работу со всеми видами EditText.

0
0
413
1

Ответы 1

Это не то, как вы это делаете (и я вообще не уверен, что такое onKey, он не является частью InputMethodService). Что вам нужно сделать, так это обнаружить изменения курсора, а затем оценить контекст курсора. Сделайте это через onUpdateCursor, получите позицию курсора, затем запросите контекст, окружающий его, через InputConnection. После этого проанализируйте контекст и определите, нужно ли использовать заглавные буквы.

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

Я попробовал метод onUpdateCursorAnchorInfo (onUpdateCursor устарел с уровня API 21) и поместил в него InputConnection, чтобы обнаруживать окружающий текст курсора, но не работает.

Sudi 29.05.2018 16:10

Оно делает. Вот как мы это сделали в Swype

Gabe Sechan 29.05.2018 16:10

`@Override public void onUpdateCursorAnchorInfo (CursorAnchorInfo cursorAnchorInfo) {InputConnection ic = getCurrentInputConnection (); CharSequence lastTwo = ic.getTextBeforeCursor (2, 0); если (lastTwo == null || lastTwo.length () <= 0 || (lastTwo.charAt (1) == ASCII_SPACE && isSentenceSeparator (lastTwo.charAt (0)))) {bCaps = true; myKeyboard.setShifted (bCaps); myKeyboardView.invalidateAllKeys (); }} `

Sudi 29.05.2018 16:11

Гейб, не могли бы вы дать мне образец с помощью onUpdateCursor?

Sudi 29.05.2018 16:13

Кажется, что onUpdateCursorAnchorInfo не запускается. Что не так?

Sudi 31.05.2018 14:30

Другие вопросы по теме