Клавиатура Google испортила мой пользовательский диапазон

Ну, я пытаюсь создать форматированный текстовый редактор. У меня есть несколько кнопок для форматирования редактируемого текста (жирный шрифт, курсив, URL-адрес и т. д.).
Я использую Клавиатура Google со всеми включенными параметрами исправления текста (Настройки > Язык и ввод > Клавиатура Google > Исправление текста).

Я делаю следующее:

В своем EditText я пишу текст.
text

Я выбираю его и применяю полужирный интервал с SPAN_EXCLUSIVE_EXCLUSIVE (33) в качестве флажков.
выделенный текст
введите здесь описание изображения

Затем я перемещаю курсор в конец.
курсор в конце

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

Хорошо, вот в чем проблема. Мои жирные флажки изменились... Почему!?

Вот некоторые журналы:

D/ContentUtils: beforeTextChanged: start  end  span             flags
D/ContentUtils: beforeTextChanged: 0      7    ChangeWatcher    8388626
D/ContentUtils: beforeTextChanged: 0      7    ChangeWatcher    6553618
D/ContentUtils: beforeTextChanged: 0      7    TextKeyListener  18
D/ContentUtils: beforeTextChanged: 0      7    SpanController   18
D/ContentUtils: beforeTextChanged: 7      7    START            546
D/ContentUtils: beforeTextChanged: 7      7    END              34
D/ContentUtils: beforeTextChanged: 0      7    SpellCheckSpan   33
D/ContentUtils: beforeTextChanged: 0      7    CustomBoldSpan   33

D/ContentUtils: onTextChaghed
D/ContentUtils: onTextChaghed:     0      8    ChangeWatcher    8392722
D/ContentUtils: onTextChaghed:     0      8    ChangeWatcher    6557714
D/ContentUtils: onTextChaghed:     0      8    TextKeyListener  4114
D/ContentUtils: onTextChaghed:     0      8    SpanController   4114
D/ContentUtils: onTextChaghed:     8      8    START            546
D/ContentUtils: onTextChaghed:     8      8    END              34
D/ContentUtils: onTextChaghed:     0      8    CustomBoldSpan   4129
D/ContentUtils: onTextChaghed:     0      8    UnderlineSpan    289
D/ContentUtils: onTextChaghed:     0      8    ComposingText    289

D/ContentUtils: afterTextChanged
D/ContentUtils: afterTextChanged:  0      8    ChangeWatcher    8392722
D/ContentUtils: afterTextChanged:  0      8    ChangeWatcher    6557714
D/ContentUtils: afterTextChanged:  0      8    TextKeyListener  4114
D/ContentUtils: afterTextChanged:  0      8    SpanController   4114
D/ContentUtils: afterTextChanged:  8      8    START            546
D/ContentUtils: afterTextChanged:  8      8    END              34
D/ContentUtils: afterTextChanged:  0      8    CustomBoldSpan   4129
D/ContentUtils: afterTextChanged:  0      8    UnderlineSpan    289
D/ContentUtils: afterTextChanged:  0      8    ComposingText    289
D/ContentUtils: afterTextChanged:  0      8    SpellCheckSpan   33

Когда я использую другую клавиатуру, все пошло нормально.
Когда я отключил настройки коррекции текста, все пошло нормально. Весь мой диапазон является пользовательским диапазоном и подклассом существующего диапазона Android.

Кажется, Google Keyboard самостоятельно изменяет мои промежутки (вероятно, из-за настроек Show suggestions).
Как этого избежать?
Может быть, я что-то упускаю из-за флагов промежутков?


person Zxcv    schedule 14.09.2016    source источник
comment
Дайте вашему редактированию тип ввода текста без предложения. Если все еще возникает проблема, будет что-то еще.   -  person Emre Aktürk    schedule 14.09.2016
comment
Ваша реализация должна быть изменена. Вы можете сохранить данные и применить каждую из них к функции изменения текста.   -  person Emre Aktürk    schedule 14.09.2016
comment
Итак, я должен получить все пользовательские диапазоны в beforeTextChanged(), сохранить их и применить каждый в afterTextChanged()!? Звучит как огромный процесс.   -  person Zxcv    schedule 14.09.2016
comment
никакое предложение в типе ввода не работает.   -  person Zxcv    schedule 14.09.2016
comment
Вы можете сделать это постепенно. Сохраняйте последние использованные промежутки и добавляйте их все больше и больше. Было бы более дружественным к процессору.   -  person Emre Aktürk    schedule 14.09.2016


Ответы (1)


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

Проблема в том, что для каждой набранной буквы слово удаляется и добавляется обратно с добавленной буквой. В этот момент я теряю некоторые пользовательские промежутки, например, в середине слова.

Если вы добавите TextWatcher в свой EditText, он будет вызываться 2 раза: первый с добавленной буквой, второй после удаления и добавления обратно всего слово. Совсем не удобно.

Таким образом, уродливое решение состоит в том, чтобы скопировать все промежутки во время beforeTextChanged() и применить обратно во время второго afterTextChanged(). Но это сложно реализовать.

В любом случае, другие приложения не лучше: у GMail и Evernote такие же проблемы. Я выбираю не волноваться и не применять уродливое решение. Мой форматированный текстовый редактор можно использовать так...

person Zxcv    schedule 26.09.2016