入力した文字のスペルをチェックする


Android4.0(以下、ICS)から、EditTextなどで入力された文字列のスペルをチェックする機能が追加されました。

スペルチェックは、ユーザが登録したユーザ辞書からチェックを行います。

スペルのチェックをするには、以下のクラスやメソッドを使います

クラスやメソッド説明
TextServicesManagerクラステキストサービスを利用するためのサービスマネージャ
SpellCheckerSessionクラスSpellCheckerServiceの機能を利用するためのクラス
SpellCheckerSessionクラスのSpellCheckerSessionListenerメソッドテキストサービスの結果を受け取るためのリスナー
SpellCheckerSessionクラスのgetSuggestionsメソッド指定された文字列に最も近い単語を取得する
SpellCheckerSessionListenerリスナーのonGetSuggestionsインターフェースgetSuggestionsメソッドへのコールバック

スペルチェッカーの機能を直接利用するためには、getSuggestions(TextInfo, int) getSuggestions(TextInfo[], int, boolean) を使います。

※スペルチェッカーを利用するためには、ManifestにBIND_TEXT_SERVICEのpermissionを追加する必要があります。

サンプルコード

それでは、実際にコードで見てみましょう。

まずはManifestへ、次の一文を追加します。
■AndroidManifest.xml

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

BIND_TEXT_SERVICEのpermissionをManifestへ登録しないと、スペルチェッカーの機能を利用することはできません。

次に、ソースコードです。
まずは、スペルチェックの開始と終了についてです。

■src/TextserviceActivity.java

SpellCheckerSession session;
//スペルチェックの開始
session.getSuggestions(new TextInfo(【チェックしたい文字】), 10);
//スペルチェックの終了
session.close();

3行目:スペルチェックの開始です。
SpellCheckerSessionクラスのgetSuggestionsメソッドの第1引数にはスペルチェックをしたい単語を、第2引数には、スペルチェックをした結果として受け取る候補の個数を指定します。
5行目:スペルチェックを終了します。

次に、SpellCheckerSessionクラスのgetSuggestionsメソッドによって開始されたスペルチェックの中身を見ていきます。

■src/TextserviceActivity.java

SpellCheckerSession session;
//リスナーの登録。スペルチェックは英語
session = manager.newSpellCheckerSession(null, Locale.ENGLISH,
		new SpellCheckerSessionListener() {
			public void onGetSuggestions(SuggestionsInfo[] results) {
				for (SuggestionsInfo result : results) {
					//候補が無かった場合
						if (result.getSuggestionsCount() <= 0) {
						tv.setText("no suggestions");
					}
					//候補が見つかった場合
					else {
						tv.setText("did you mean "
						+ result.getSuggestionAt(0) + "?");
					}
				}
			}
		}, false);

3~5行目:スペルチェッカーを利用するためのリスナーの登録です。
今回は英単語を調べるため、TextServicesManagerクラスのnewSpellCheckerSessionメソッドの第2引数には、英語を指定しました。

8行目:もし該当する単語が無かった場合の処理です。
該当する単語が無かった場合は、onGetSuggestionsの引数であるresultsの個数がゼロになります。
スペルチェックをした結果として得られた単語の候補(results)は、Array(配列)として返されます。

それでは、プログラムを全体として見てみましょう。

今回は、EditText内に入力した英語を、ボタンを押したらスペルをチェックするアプリにしました。

■src/TextserviceActivity.java

public class TextserviceActivity extends Activity {
	SpellCheckerSession session;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		final TextView tv = (TextView) findViewById(R.id.textView1);

		TextServicesManager manager = (TextServicesManager) getSystemService(TEXT_SERVICES_MANAGER_SERVICE);
		//リスナーの登録。スペルチェックは英語
		session = manager.newSpellCheckerSession(null, Locale.ENGLISH,
				new SpellCheckerSessionListener() {
					public void onGetSuggestions(SuggestionsInfo[] results) {
						for (SuggestionsInfo result : results) {
							//候補が無かった場合
							if (result.getSuggestionsCount() <= 0) {
								tv.setText("no suggestions");
							}
							//候補が見つかった場合
							else {
								tv.setText("did you mean "
										+ result.getSuggestionAt(0) + "?");
							}
						}
					}
				}, false);

		Button btn = (Button) findViewById(R.id.button1);
		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				EditText et = (EditText) findViewById(R.id.editText1);
				//スペルチェックの開始
				session.getSuggestions(new TextInfo(et.getText().toString()), 10);
				//スペルチェックの終了
				session.close();
			}
		});
	}
}

12〜14行目:スペルチェッカーを利用するためのリスナーの登録です。
15行目:もし該当する単語が無かった場合の処理です。
31行目:スペルチェックの開始です。
32行目:スペルチェックを終了します。

実際に稼動させると、次の図のように、スペルチェックの結果がTextViewへ表示されます。