How to include suggestions in Android Keyboard

You can use the static method UserDictionary.Words.addWord(....): Link

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);
}

You will need to add this permission to your manifest:

<uses-permission android:name="android.permission.WRITE_USER_DICTIONARY"/>

Added words will appear in Settings > Language & input > Personal dictionary.

If you are implementing your own soft keyboard, I suggest you go through Creating an Input Method. The suggestions are usually shown in the Candidates View. By default, InputMethodService#onCreateCandidatesView() returns null. You should override this method to return your implementation of the suggestions bar.

Here’s a sample project that implements the Candidates view: SoftKeyboard.

More info:

Word and phrase suggestions go in the candidates view. Info about how to create & populate it are in the sample project mentioned above.

As far as I know, the selection of what words/phrases to suggest is developer’s responsibility. Android does not provide those for you. You will probably need a set of dictionaries – one for each language/locale you plan on supporting. You may also want to maintain a dictionary of user-specified words.

Android’s default keyboard uses these: Link

If you download one of these, unpack it and open with a text editor:

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

As apparent, the frequency plays a pivotal role in determining the suitability of a word as a suggestion. You probably don’t want to suggest tachometer when the user types ta. You probably do want to suggest take – frequency helps you there.

Autocorrection:

word=id,f=99,flags=,originalFreq=99
shortcut=I'd,f=whitelist

The flags indicate appropriateness:

word=goddamn,f=0,flags=offensive,originalFreq=62

Even if you decide to use these dictionaries, the code to parse them and obtain meaningful suggestions will have to come from you.

Two articles (both by Peter Kankowski) that talk about predictive text input & spelling correction:

Using DAWG for predictive text input

Using Ternary DAGs for Spelling Correction

CandidatesView:

The first thing you should know about the CandidatesView: it is optional. In fact, LatinIME (android’s default soft keyboard) does not use it. Instead LatinIME has its own implementation – SuggestionStripView – which is similar. The default behavior of InputMethodService#onCreateCandidatesView() is to return null. If you choose to provide your own implementation, don’t override this method.

You need to decide what your CandidatesView should look like. One possible implementation can be a HorizontalScrollView. After you evaluate your suggestions (for example, user start writing “as”, and your suggestion-logic gives you a List<String> containing “has”, “was”, “assist”, “ask”, “asked”, “asking”, “assume”), create & add TextViews holding these strings to the HorizontalScrollView(LinearLayout). This way, user can scroll horizontally and choose the intended word by clicking on it.

It is up to you to decide whether to use the API or handle the CandidatesView yourself. If you want to use the API, override InputMetodService#onCreateCandidatesView(), inflate your custom layout, then return it. Hold a reference to it, so you can update it when required. To control CandidatesView's visibility, use the method setCandidatesViewShown(boolean).

Leave a Comment