Как включить предложения в Android-клавиатуру

Я работаю над Android SoftKeyboard. Я создал макет для клавиатуры, но не знаю, как включать предложения, которые появляются, если мы введем слово в EditText.
Например, если я пишу "Kn", то "Известные" и "Известные" показаны в разделе "Предложения".
Итак, мои вопросы -
1) Как включить предложения в Android Softkeyboard?
2) Есть ли способ включить наш собственный список предложений? Thanx много вперед.
Я уже проверил этот и этот, но не смог найти правильный ответ. Любая помощь будет оценена.

ИЗМЕНИТЬ
Я хочу включить предложения непосредственно над клавиатурой, как показано на рисунке ниже.

Suggestions in keyboard

Ответ 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).

Ответ 2

Если вы создаете пользовательскую клавиатуру, я предлагаю вам пройти Создание метода ввода, есть пример кода, который вы можете переместить. Вероятно, CandidateView - это то, что вы ищете. Это объясняется в ссылке выше.

Если вы хотите предоставить встроенную проверку орфографии, вы хотите проверить Рамку проверки орфографии

Надеюсь, что это поможет.

Ответ 3

Я использовал линт " https://android.googlesource.com/platform/development/+/master/samples/SoftKeyboard?autodive=0%2F ", поэтому я создал собственное приложение, но получаю ошибку

java.lang.RuntimeException: Unable to instantiate service com.wda.keyboard.mytestkb.SoftKeyboard: java.lang.ClassNotFoundException: Didn't find class "com.wda.keyboard.mytestkb.SoftKeyboard" on path: DexPathList[[zip file "/data/app/com.wda.keyboard.mytestkb-1/base.apk"],nativeLibraryDirectories=[/data/app/com.wda.keyboard.mytestkb-1/lib/arm, /vendor/lib, /system/lib]]



 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.wda.keyboard.mytestkb.SoftKeyboard" on path: DexPathList[[zip file "/data/app/com.wda.keyboard.mytestkb-1/base.apk"],nativeLibraryDirectories=[/data/app/com.wda.keyboard.mytestkb-1/lib/arm, /vendor/lib, /system/lib]]

Не могли бы вы помочь мне решить эту проблему?