株式会社ライブキャストロゴ 株式会社ライブキャスト

2011年11月3日 追記
ご注意!
Google Translate API v1が2011年12月1日にサービスが終了いたします。添付のサンプルソースでは、Google Translate API v1を利用していますので、翻訳が正常に機能しない場合がございます。ご承知おきください。

Android Market公開を目指してAndroidアプリを開発する!(通知機能実装編)の続きです。

今回は、アプリケーションの設定を変更する機能を実装していきたいと思います。これが、連載で実装してきた最後の機能となります。長かったAndroid向け簡易翻訳アプリケーションの開発もいよいよ終わりです。

Androidには、PreferenceActivityクラスという設定画面用のActivityがあらかじめ用意されてますので、こちらを使って実装していきたいと思います。

Androidのド肝 ? 設定画面の作り方(PreferenceActivity)を参考にさせていただき、PreferenceActivityクラスを継承したActivityクラスを作りました。

package jp.flashcast.translator.android.view;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import jp.flashcast.translator.android.R;

public class ConfigActivity extends PreferenceActivity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.config);
	}
}


画面の構成はxmlファイルに定義します。12行目で指定しているconfig.xmlファイルです。今までlayoutのxmlファイルはres/layoutフォルダに配置していましたが、今回はresフォルダの下にxmlフォルダを作成して、そこに配置しました。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android">
  <PreferenceCategory android:title="翻訳設定">
  	<ListPreference
  		android:key="list_src_language"
  		android:title="翻訳される言語"
  		android:summary="翻訳対象となる言語のデフォルトを設定します。"
  		android:dialogTitle="選択してください。"
  		android:defaultValue="en"
  		android:entries="@array/language_label"
  		android:entryValues="@array/language_value" />
  	<ListPreference
  		android:key="list_dst_language"
  		android:title="翻訳結果の言語"
  		android:summary="翻訳結果となる言語のデフォルトを設定します。"
  		android:dialogTitle="選択してください。"
  		android:defaultValue="ja"
  		android:entries="@array/language_label"
  		android:entryValues="@array/language_value" />
  </PreferenceCategory>
</PreferenceScreen>

メイン画面には、何語から何語に翻訳するかを選択するSpinnerコントロールがありますが、今回はこのデフォルトを設定する画面にしてみました。

画面は、こんな感じです。

config

設定項目を選択すると、言語選択のダイアログが表示されます。

languages

次に、この設定画面を開くところをメイン画面に実装します。オプションメニューから開くことにしましたので、まず、オプションメニューを設定します。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	menu.add(Menu.NONE, Menu.FIRST + 1, Menu.NONE, "設定");

    	return super.onCreateOptionsMenu(menu);
    }

Android端末の本体についている「menu」ボタンを押すと、オプションメニューが表示されます。

menu

このメニューを選択して、設定画面を開くところは以下のようにしました。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	boolean result = false;

    	if (item.getItemId() == (Menu.FIRST + 1)) {
        	Intent intent = new Intent(this, ConfigActivity.class);
			intent.putExtra("ConfigModel", cmodel);
        	intent.setAction(Intent.ACTION_VIEW);
        	startActivity(intent);
        	result = true;
    	}

    	return result;
    }

設定が変更されたら、メイン画面のほうに反映したいので、設定変更時の処理を実装します。

メイン画面に、SharedPreferences.OnSharedPreferenceChangeListenerインターフェイスを実装します。

public class TranslatorSample12 extends Activity implements Runnable, OnInitListener, OnSharedPreferenceChangeListener {

設定変更時の処理は以下のようにしました。

	public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
			String key) {
		cmodel.setSrcLanguage(sharedPreferences.getString("list_src_language", "en"));
		cmodel.setDstLanguage(sharedPreferences.getString("list_dst_language", "ja"));

		if (gmodel == null) {
			ToggleButton vector = (ToggleButton)findViewById(R.id.vector);

	    	Spinner spSrc = (Spinner)findViewById((!vector.isChecked()) ? R.id.srclanguage : R.id.dstlanguage);
	    	Spinner spDst = (Spinner)findViewById((!vector.isChecked()) ? R.id.dstlanguage : R.id.srclanguage);

	    	setSelectedItem(spSrc, cmodel.getSrcLanguage());
	    	setSelectedItem(spDst, cmodel.getDstLanguage());
		}
	}

最後に、メイン画面が初期表示されたときにも、設定されている内容を反映させたいので、画面初期化処理の1つに以下のような処理を追加しました。

    private void initConfigModel() {
        if (cmodel == null) {
        	cmodel = new ConfigModel();
        }

    	SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    	preferences.registerOnSharedPreferenceChangeListener(this);

		cmodel.setSrcLanguage(preferences.getString("list_src_language", "en"));
		cmodel.setDstLanguage(preferences.getString("list_dst_language", "ja"));
    }

これで、アプリケーションを起動すると、メイン画面にデフォルトの翻訳設定が反映されるようになりました。

main

※ 初期値は「English」から「Japanese」に翻訳する設定になっています。

このように、設定画面をとても簡単に用意することができました。PreferenceActivityクラス、是非、試してみてください!

サンプルソース

サンプルソースには、Android Market公開を目指してAndroidアプリを開発する!(TextToSpeech日本語対応編)でご紹介した日本語読み上げライブラリをlibフォルダ配下にandroid-jatts-0.0.1.jarも含んでいますが、プロジェクトへの登録が再度必要ですので、ご注意ください。