如何在 Android 键盘中包含建议

How to include suggestions in Android Keyboard

我正在研究 Android SoftKeyboard。我已经为键盘创建了布局,但不知道如何包含如果我们在 EditText 中键入某些单词时出现的建议。
例如,如果我写 "Kn",那么 "Known" 和 "Known" 会显示在建议中。
所以我的问题是 -
1) 如何在 Android 软键盘中包含建议?
2)有什么办法可以包含我们自己的建议列表吗?
非常感谢。
我已经检查过 this and this 但找不到任何正确的答案。任何帮助将不胜感激。

编辑
我想直接在键盘上方包含建议,如下图所示。

您可以使用静态方法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);
}

您需要将此权限添加到清单中:

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

添加的单词将出现在 Settings > Language & input > Personal dictionary 中。

如果您要实现自己的软键盘,我建议您完成 Creating an Input Method。这些建议通常显示在 Candidates View 中。默认情况下,InputMethodService#onCreateCandidatesView() return 为空。您应该覆盖此方法以 return 您对建议栏的实施。

这是一个实现 Candidates 视图的示例项目:SoftKeyboard

更多信息:

候选人视图中的单词和短语建议。有关如何创建和填充它的信息在上面提到的示例项目中。

据我所知,选择 words/phrases 建议的内容是开发人员的责任。 Android 不为您提供这些。您可能需要一套词典 - 每个 language/locale 您计划支持的词典。您可能还想维护用户指定单词的字典。

Android 的默认键盘使用这些:Link

如果您下载其中之一,请将其解压缩并使用文本编辑器打开:

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

很明显,频率在确定单词作为建议的适用性方面起着关键作用。您可能不想在用户键入 ta 时建议 tachometer。您可能 do 想建议 take - 频率可以帮助您。

自动更正:

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

标志表明适当性:

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

即使您决定使用这些词典,解析它们并获得有意义的建议的代码也必须来自您。

关于 predictive text inputspelling correction 的两篇文章(均由 Peter Kankowski 撰写):

Using DAWG for predictive text input

Using Ternary DAGs for Spelling Correction

CandidatesView:

关于 CandidatesView 您应该了解的第一件事:它是可选的。事实上,LatinIME(android的默认软键盘)并没有使用它。相反 LatinIME 有它自己的实现 - SuggestionStripView - 这是相似的。 InputMethodService#onCreateCandidatesView() 的默认行为是 return null。如果您选择提供自己的实现,请不要覆盖此方法。

您需要决定 CandidatesView 的外观。一种可能的实现可以是 HorizontalScrollView。在你评估你的建议后(例如,用户开始写 "as",你的建议逻辑给你一个包含 "has"、"was"、"assist" 的 List<String>, "ask"、"asked"、"asking"、"assume"),创建并添加 TextViews 保存这些字符串到 HorizontalScrollView(LinearLayout)。这样,用户可以水平滚动并通过单击选择想要的词。

由您决定是使用 API 还是自己处理 CandidatesView。如果您想使用 API,覆盖 InputMetodService#onCreateCandidatesView(),扩充您的自定义布局,然后 return 它。保留对它的引用,以便您可以在需要时更新它。要控制 CandidatesView's 可见性,请使用方法 setCandidatesViewShown(boolean)

如果您正在创建自定义键盘,我建议您通过 Creating Input Method, there is a sample code 来完成。 CandidateView 可能就是您正在寻找的。在上面的link中有解释。

如果您想提供内联拼写检查器,您需要查看 Spellchecker framework

希望对您有所帮助。