Ответ 1
Вы можете использовать статический метод UserDictionary.Words.addWord(....)
: Ссылка
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
// On JellyBean & above, you can provide a shortcut and an explicit Locale
UserDictionary.Words.addWord(this, "MadeUpWord", 10, "Mad", Locale.getDefault());
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.CUPCAKE) {
UserDictionary.Words.addWord(this, "MadeUpWord", 10, UserDictionary.Words.LOCALE_TYPE_CURRENT);
}
Вам нужно будет добавить это разрешение в свой манифест:
<uses-permission android:name="android.permission.WRITE_USER_DICTIONARY"/>
Добавленные слова появятся в Settings > Language & input > Personal dictionary
.
Если вы реализуете свою собственную мягкую клавиатуру, я предлагаю вам пройти через Создание метода ввода. Предложения обычно отображаются в Candidates View
. По умолчанию InputMethodService#onCreateCandidatesView()
возвращает значение null. Вы должны переопределить этот метод, чтобы вернуть реализацию панели предложений.
Вот пример проекта, который реализует представление "Кандидаты": SoftKeyboard.
Дополнительная информация:
Слова и фразы идут в представлении кандидатов. Информация о том, как его создать и заполнить, приведена в примере проекта, упомянутом выше.
Насколько я знаю, выбор того, какие слова/фразы предлагать, является ответственностью разработчика. Android не предоставляет их для вас. Вам, вероятно, понадобится набор словарей - по одному для каждого языка/локали, которые вы планируете поддерживать. Вы также можете сохранить словарь пользовательских слов.
Android-клавиатура по умолчанию использует следующие: Ссылка
Если вы загрузите один из них, распакуйте его и откройте с помощью текстового редактора:
dictionary=main:en,locale=en,description=English,date=1402373178,version=47
word=the,f=222,flags=,originalFreq=222
word=to,f=215,flags=,originalFreq=208
word=of,f=214,flags=,originalFreq=214
word=and,f=212,flags=,originalFreq=212
word=in,f=210,flags=,originalFreq=210
.... 165,635 more lines
Как видно, частота играет ключевую роль в определении пригодности слова как предложения. Вероятно, вы не хотите предлагать tachometer
, когда пользователь вводит ta
. Вероятно, вы хотите предложить take
- частота помогает вам там.
автоисправление:
word=id,f=99,flags=,originalFreq=99
shortcut=I'd,f=whitelist
Флаги указывают на уместность:
word=goddamn,f=0,flags=offensive,originalFreq=62
Даже если вы решите использовать эти словари, код для их анализа и получения значимых предложений должен будет исходить от вас.
Две статьи (и Питер Канковский), которые говорят о predictive text input
и spelling correction
:
Использование DAWG для интеллектуального ввода текста
Использование тернарных DAG для коррекции орфографии
CandidatesView
Первое, что вам нужно знать о CandidatesView: это необязательно. Фактически, LatinIME
(специальная клавиатура по умолчанию для Android) не использует его. Вместо этого LatinIME
имеет свою собственную реализацию - SuggestionStripView
- аналогичную. Поведение InputMethodService#onCreateCandidatesView()
по умолчанию - вернуть значение null. Если вы решите предоставить свою собственную реализацию, не переопределяйте этот метод.
Вам нужно решить, как выглядит ваш кандидат. Одна возможная реализация может быть HorizontalScrollView
. После того, как вы оцениваете свои предложения (например, пользователь начинает писать "как", а ваша логика предложений дает вам List<String>
, содержащий "имеет", "было", "помогать", "спрашивать" , "спрашивать" , "спрашивать" "," предположим "), создайте и добавьте TextViews
, удерживая эти строки в HorizontalScrollView(LinearLayout)
. Таким образом, пользователь может прокручивать по горизонтали и выбирать нужное слово, щелкая по нему.
Вам решать, использовать ли API или обрабатывать CandidatesView
самостоятельно. Если вы хотите использовать API, переопределите InputMetodService#onCreateCandidatesView()
, раздуйте свой собственный макет, а затем верните его. Держите ссылку на нее, поэтому вы можете обновить ее по мере необходимости. Чтобы управлять видимостью CandidatesView's
, используйте метод setCandidatesViewShown(boolean)
.