Я новичок в программировании 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.
Это не то, как вы это делаете (и я вообще не уверен, что такое onKey, он не является частью InputMethodService). Что вам нужно сделать, так это обнаружить изменения курсора, а затем оценить контекст курсора. Сделайте это через onUpdateCursor, получите позицию курсора, затем запросите контекст, окружающий его, через InputConnection. После этого проанализируйте контекст и определите, нужно ли использовать заглавные буквы.
Обратите внимание, что простого поиска концов предложений недостаточно. А. также может быть частью числа, аббревиатуры и т. д. На самом деле, чтобы сделать это правильно, требуется некоторая работа.
Оно делает. Вот как мы это сделали в Swype
`@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 (); }} `
Гейб, не могли бы вы дать мне образец с помощью onUpdateCursor?
Кажется, что onUpdateCursorAnchorInfo не запускается. Что не так?
Я попробовал метод onUpdateCursorAnchorInfo (onUpdateCursor устарел с уровня API 21) и поместил в него InputConnection, чтобы обнаруживать окружающий текст курсора, но не работает.