Preferenceチュートリアル

アプリケーションの設定の保存法

通常のアプリケーションではユーザーが動作や表示を設定することができる。Androidでは設定のGUIと記憶処理を簡単に実装する方法を提供している。まず、設定のGUIを簡単に実装する方法と記憶処理は一体となっているので一緒に説明する。やり方は設定項目をxmlファイルとしてres/xml/setting.xml(名前は何でも良い。後述するaddPreferenceFromResoureceメソッドの引数に指定すれば良い)に配置し、javaソースから読み込む。実例としてボタンの表記を日本語にするか、英語にするかという事を設定する設定項目を実装してみよう。

まず、xmlファイルから説明する。以下のCheckBoxPreferenceはチェックボックスでboolean値を設定するためのものになる(他にもリストを選択する物やユーザに入力指せる物等がある。)

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

<CheckBoxPreference android:key="language" android:title="言語" android:defaultValue="false" android:summary="日本語、英語を切り替える"></CheckBoxPreference>
</PreferenceScreen>
	

次にjavaのソースからxmlファイルで設定した事項を読み込む。ただし、PreferenceActivityを継承したクラスからしか読み込みができないため、メインアクティビティと設定用のアクティビティを分け、メインアクティビティから設定用のアクティビティを起動する方式を取る。注目して欲しいのは二箇所で設定用のアクティビティ(Setting)のaddPreferencesFromResourceでxmlファイルで設定した事項を読み込んでいるところと、メインアクティビティ(Preference)でPreferenceManagerクラスのスタティックメソッドを使って設定した内容を読み込んでいるところである。

package com.suddenAngerSystem;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;

public class Preference extends Activity implements android.view.View.OnClickListener {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Button button = new Button(this);
        button.setTextColor(0xff00ffff);

        if(Setting.getIsEnglish(this) == true) {
        	button.setText("Setting");
        }
        else {
        	button.setText("設定する");
        }

        setContentView(button);

        button.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
    	final Intent intent = new Intent(this, Setting.class);
    	startActivity(intent);
    }
}
	
package com.suddenAngerSystem;

import android.content.Context;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;

public class Setting extends PreferenceActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//xmlで定義した設定用の内容を読み込み
		addPreferencesFromResource(R.xml.setting);
	}

	public static boolean getIsEnglish(Context context) {
		//languageキーで設定を読み出し
		return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("language", false);
	}
}
	

設定を変えて起動すると英語、日本語の表記が切り替わる

他の設定形式

例では簡単のためチェックボックスのみを使用したが、リスト形式の設定項目、入力形式の設定項目なども提供されている。詳細はSDKをインストールしたディレクトリ\platforms\android-1.5\samples\ApiDemos\にサンプルがあるのでそれを参考にすると良い。

設定用のアクティビティ以外からの設定

今まで説明してきたPreferenceの機構はxmlファイルで定義した設定用GUIからの設定だけではなく、javaのソースからも設定ができるし、設定項目だけではなく、他の情報も記憶ができる。そのため、わざわざファイルに書き込んで管理するよりもPreferenceの機構を使用して状態を記憶した方が便利な場合もある。(ただし、サイズが小さいものに限った方が良い。保存先をSDカードなどにはできないため、動画などを保存してしまうと本体のフラッシュメモリを消耗してしまう。)以下でそのやり方を見てみよう

実例としてエディットコントロールに入力した文字を更新+適用ボタンを押した際に設定として保存し、起動されたタイミングで読み出すように実装してみよう。ポイントはgetPreferenceメソッドでSharedPreferencesクラスのインスタンスを取得し、getString()でPreferenceに記憶された情報を取得している箇所。SharedPreferenceクラスのeditメソッドで編集用のインターフェースを取得し、setString()でPreferenceに情報を記憶している箇所となる。

package com.suddenAngerSystem;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;

public class Preference extends Activity {
	final static int UPDATE_BUTTON_ID = 100;
	final static int SETTING_BUTTON_ID = 101;
	final static int EDITTING_ID = 102;
	final static String EDITTING_KEY = "edditing_key";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //更新、適用ボタンを作成
        Button updateButton = new Button(this);
        updateButton.setText("更新+適用する");
        updateButton.setId(UPDATE_BUTTON_ID);
        final android.view.View.OnClickListener updateListener = new android.view.View.OnClickListener() {
        	public void onClick(View v) {
        		//更新、適用ボタンが押されたら、設定ボタンの文字を設定に従って日本語/英語にする。
        		final Button settingButton = (Button)findViewById(SETTING_BUTTON_ID);
                if(Setting.getIsEnglish(v.getContext()) == true) {
                	settingButton.setText("Setting");
                }
                else {
                	settingButton.setText("設定する");
                }
                //更新、適用ボタンが押されたら、テキスト入力されている内容を保存する
                final EditText edit = (EditText)findViewById(EDITTING_ID);
                final String inputString = edit.getText().toString();
                //キー、値のペアで記憶する。この場合は入力文字列を記憶する
                //注:通常は設定を全て設定した後にcommitする。また、commitしないと出力されないため、最終的にcommitが必要。
                getPreferences(MODE_PRIVATE).edit().putString(EDITTING_KEY, inputString).commit();
        	}
        };
        updateButton.setOnClickListener(updateListener);

        //設定ボタンを作成
        Button settingButton = new Button(this);
        settingButton.setId(SETTING_BUTTON_ID);
        final android.view.View.OnClickListener settingListener = new android.view.View.OnClickListener() {
        	public void onClick(View v) {
        		//設定ボタンが押されたら設定用のアクティビティを起動
            	final Intent intent = new Intent(v.getContext(), Setting.class);
            	startActivity(intent);
        	}
        };
        settingButton.setOnClickListener(settingListener);
        if(Setting.getIsEnglish(this) == true) {
        	settingButton.setText("Setting");
        }
        else {
        	settingButton.setText("設定する");
        }

        //テキスト編集のGUIを作成
        EditText editControl = new EditText(this);
        editControl.setId(EDITTING_ID);
        final String inputString = getPreferences(MODE_PRIVATE).getString(EDITTING_KEY, "");
        editControl.setText(inputString);

        //それぞれのGUIアイテムを垂直方向に直線配置する
        LinearLayout layout = new LinearLayout(this);
        layout.setGravity(Gravity.FILL);
        layout.setOrientation(LinearLayout.VERTICAL);
        layout.addView(updateButton, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        layout.addView(settingButton, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        layout.addView(editControl, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        setContentView(layout);
    }
}
	

最初に起動すると以下の様に文字が表示されていない。

次に文字を入力して更新+適用するボタンを押す。

起動し直すと文字が最初から入力されている

コンテンツプロバイダー、SQLite、ファイルアクセスについては別途説明。

参考サイト

宿題

以下の様な機能を持つアプリケーションを作成せよ。

  1. 5件のテキストが保存できる

ヒント:EditTextPreferenceを使用する

以下の様なイメージ。

解答例

コメントアウトしてあるので、ソースを確認すること。