libro
www.tuyano.com
Google androidプログラミング入門

設定画面を作る (6/6)

作成:2010-11-06 22:05
更新:2010-11-06 22:05

■PreferenceActivityの修正

では、PreferenceActivityクラス側を修正しましょう。下のリスト欄に、MySamplePrefActivityクラスの修正例を挙げておきます。

今回は、まぁとりあえずgetMyNamegetMyListだけ用意すればいいのですが、これだけではちょっと面白く無いので、「設定画面を開いたとき、各項目の説明部分に、設定内容が表示される」という機能と、設定を変更後、この説明が更新されるという機能を追加してみました。では、それぞれ説明しましょう。

・getMyName/getMyListメソッド
それぞれ、mynamemylistの設定値を取り出して返すものです。設定項目の値というのは、2段階の処理で取得します。

1.まず、SharedPreferencesインスタンスを取り出します。これは設定情報を管理するためのクラスで、これはPreferenceManagerクラスの「getDefaultSharedPreferences」メソッドを使って取り出すことができます。このメソッドは、引数にContext(要するに、this)を渡して呼び出します。

2.SharedPreferencesのメソッドを呼び出して、設定の値を取り出します。ここでは「getString」というメソッドを呼び出していますが、これは第1引数に指定したキーのString値を取り出すためのものです(第2引数にはデフォルトの値を指定します)。SharedPreferencesには、このgetStringのようなメソッドが多数用意されています。例えばint値を取得するなら「getInt」、float値なら「getFloat」、真偽値なら「getBoolean」といった具合です。

ここでは第1引数に、取り出したい設定項目のキーを指定しています。これは設定画面のXMLファイルに記述したタグの「android:key」属性で指定した名前です。これにより、指定されたキーの項目の値が取り出されるというわけです。

・onCreateの追加処理
onCreateメソッドでは、各設定項目のコンポーネントを取り出して、その説明文の内容を修正し、更に設定を変更した時のイベント処理を組み込んでいます。これも行っていることを順に整理しましょう。

1.コンポーネントの取得は、「findPreference」メソッドで行ないます。これで、引数にコンポーネントのキーを指定すれば、そのコンポーネントが返されます。ここでは、EditTextPreferenceListPreferenceのインスタンスを取り出していることが分かります。

2.説明文を変更します。これは、「setSummary」メソッドで行うことができます。これで引数にテキストを指定すれば、その項目の説明文が変更できます。同様に、「setTitle」というメソッドを使えばタイトルも変更できます。

3.設定された値が変更された時のイベント処理は、「OnPreferenceChangeListener」というイベントリスナーを組み込むことで可能になります。これはコンポーネントの「setOnPreferenceChangeListener」メソッドを使って組み込みます。

このOnPreferenceChangeListenerインターフェイスには「onPreferenceChange」というメソッドが用意されており、これが設定変更時に呼び出されます。引数には、イベントが発生した項目を示すPreferenceインスタンスと、変更前の値がObjectとして渡されます。ここで、設定変更時に必要な処理を行ないます。

このメソッドはbooleanを返値に持っており、trueを返せばそのまま値が変更され、falseを返すと変更がキャンセルされて値はもとのままになります。

――というわけで、設定画面を作成し、必要に応じて値を変更したり、変更時に処理を行わせたり、といった基本的な操作がこれでだいたいできるようになりました。実際に設定画面を作って使ってみるとすぐに使い方はわかるようになるはずです。試しに自作アプリに設定画面を追加してみましょう!

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

package jp.tuyano.sample;

import android.content.*;
import android.os.Bundle;
import android.preference.*;
import android.preference.Preference.OnPreferenceChangeListener;

public class MySamplePrefActivity extends PreferenceActivity {
	EditTextPreference myname;
	ListPreference mylist;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		addPreferencesFromResource(R.xml.pref);
		
		myname = (EditTextPreference) findPreference("myname");
		myname.setSummary("Last value: " + myname.getText());
		myname.setOnPreferenceChangeListener(
			new OnPreferenceChangeListener(){
				@Override
				public boolean onPreferenceChange(Preference pref, Object val) {
					String oldval = ((EditTextPreference)pref).getText();
					String newval = val.toString();
					myname.setSummary(oldval + " → " + newval);
					return true;
				}
			}
		);
		mylist = (ListPreference) findPreference("mylist");
		mylist.setSummary("Last select: " + mylist.getValue());
		mylist.setOnPreferenceChangeListener(
			new OnPreferenceChangeListener(){
				@Override
				public boolean onPreferenceChange(Preference pref, Object val) {
					String newval = val.toString();
					mylist.setSummary("you select '" + newval + "'.");
					return true;
				}
			}
		);
	}
	
	public static String getMyName(Context ctx){
		SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(ctx);
		String res  = settings.getString("myname", null);
		return res;
	}
	public static String getMyList(Context ctx){
		SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(ctx);
		String res  = settings.getString("mylist", null);
		return res;
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		// 保存時の処理
		super.onSaveInstanceState(outState);
	}


}

※関連コンテンツ

「Google androidプログラミング入門」に戻る