Автокапитализация в пользовательской клавиатуре Android, когда пользователь перемещает курсор в начало предложения - PullRequest
0 голосов
/ 29 мая 2018

Я новичок в программировании на Android и учусь делать собственную пользовательскую клавиатуру для Android из образца HackersKeyboard и 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();
            }
    }
}

Я не смог найти какие-либо части образца HackersKeyboard и SoftKeyboard , связанные с этим авто-заглавными буквами.Любая помощь очень ценится.Большое спасибо.

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

1 Ответ

0 голосов
/ 29 мая 2018

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

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

...