忍者ブログ

アンドロイドのあれこれ

SpellCheckerSession & SpellCheckerService スペルチェック
EditTextなどで入力された文字列のスペルチェックはAndroid 4.0 API Level 14から追加されました。
SpellCheckerSession、SpellCheckerSessionListener、TextServicesManager、一緒に使用します。

SDKにスペルチェックのサンプルデモ、HelloSpellCheckerとSampleSpellCheckerServiceというアプリがあります。
SampleSpellCheckerServiceは実行しても起動するアプリ(アクティビティ)がありません。確認する方法は
インストールしたら、「設定」->「言語と入力」->「スペルチェック」にチェックしてスペルチェック選択すると「Sample correction」が出てきて確認できます。

HelloSpellCheckerはスペルチェックを有効している場合、スペルの候補を出すためのサンプルアプリです。
SpellCheckerSession.getSuggestions() は API Level 15まで、API Level 16からは
SpellCheckerSession.getSentenceSuggestionsが推奨されています。

HelloSpellCheckerはスペルチェックを有効している場合、スペルの候補を出すためのサンプルアプリです。
SpellCheckerSession.getSuggestions() は API Level 15まで、API Level 16からは
SpellCheckerSession.getSentenceSuggestionsが推奨されています。

サンプルアプリを少し工夫してみる
HelloSpellCheckerのサンプルがあまりにもやさしくないのでEditTextなどを追加してSpellCheckerServiceとどのようにやりとりしているかを理解しようと思います。

SampleSpellCheckerService.javaの59行目あたりのを修正します。
...
@Override
public SuggestionsInfo onGetSuggestions(TextInfo textInfo, int suggestionsLimit) {
if (DBG) {
Log.d(TAG, "onGetSuggestions: " + textInfo.getText());
}
final String input = textInfo.getText();
final int length = input.length();

//入力文字列が「an」なら候補を3個だすように
if (input.equals("an")) {
return new SuggestionsInfo(3,
new String[]{"ant", "anyone", "android"});
} else { //「an」以外なら
return new SuggestionsInfo(1,
new String[]{"候補ありません"});
}
}
...


HelloSpellCheckerAcitivty.java
public class HelloSpellCheckerActivity extends Activity implements SpellCheckerSessionListener {
private static final String TAG = HelloSpellCheckerActivity.class.getSimpleName();
private SpellCheckerSession mScs;
private TextView mMainView;
private EditText mEditText;
private Button mBtnEnter;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMainView = (TextView)findViewById(R.id.main);
mEditText = (EditText)findViewById(R.id.editText);
mBtnEnter = (Button)findViewById(R.id.btnEnter);
mBtnEnter.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
checkSpell();
}
});
}

private void checkSpell() {
String inputText = mEditText.getText().toString();
final TextServicesManager tsm = (TextServicesManager) getSystemService(
Context.TEXT_SERVICES_MANAGER_SERVICE);
mScs = tsm.newSpellCheckerSession(null, null, this, true);

//スペルチェックが有効の場合
if (mScs != null) {
//スペルチェックの取得
mScs.getSuggestions(new TextInfo(inputText), 3);
} else {
Log.e(TAG, "Couldn't obtain the spell checker service.");
}
}

//getSuggestionsのコールバック
@Override
public void onGetSuggestions(final SuggestionsInfo[] arg0) {
Log.d(TAG, "onGetSuggestions");
final StringBuilder sb = new StringBuilder();
for (int i = 0; i < arg0.length; ++i) {
sb.append('\n');

//候補の個数
int len = arg0[i].getSuggestionsCount();
for (int j = 0; j < len; j++) {
if (j != 0) {
sb.append(", ");
}
sb.append(arg0[i].getSuggestionAt(j));
}
}

//別のスレッドで候補を表示
runOnUiThread(new Runnable() {
@Override
public void run() {
mMainView.append(sb.toString());
}
});
}
...


実行イメージ
SpellCheckerSession & SpellCheckerService スペルチェック SpellCheckerSession & SpellCheckerService スペルチェック
COMMENT
NAME
TITLE
MAIL (非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS (コメント編集に必須です)
SECRET
管理人のみ閲覧できます
 
PR
© Android Advent
powered by 忍者ツールズ / 忍者ブログ / [PR]