2011-06 / 2011-06-08

前のエントリ: 日付の取得・変換(java.util.Calendar / java.util.Date) [Java]
次のエントリ: 日記内の見出しに対応してみた [chalow]

Preferencesで設定値の読書き
2011-06-08-1 / カテゴリ: [Java][Android] / [permlink]

設定の読書き。というか備忘録。
SharedPreferencesインスタンス経由で読んで、SharedPreferences.Editor経由で書き込む。

PreferenceActivity(PreferenceScreen)はまたそのうち。



SharedPreferencesの取得


任意のプリファレンス名で取得


ContextクラスのgetSharedPreference()を使う。Activity内なんかだと
SharedPreferences pref = getSharedPreference(filename, mode);
で取れ、保持対象のファイル名が、指定した filename になる。
保存先は
/data/data/パッケージ名/shared_prefs/filename.xml
になる(けど、パスは基本的に意識しない)

modeはInteger値で
MODE_PRIVATE(デフォルト)他のアプリ(パッケージ)からはアクセス不可660(rw-rw----)
MODE_WORLD_READABLE他のアプリから読み込みのみ許可664(rw-rw-r--)
MODE_WORLD_WRITEABLE他のアプリから読書き許可662(rw-rw--w-)
のどれかを指定する。
他アプリから読書きを許可する場合は MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE で 666 になる。

Activity固有のプリファレンス


ActivityクラスのgetPreferences()を使う
SharedPreferences pref = getPreferences(mode);
ファイル名は、呼出元のクラス名になるので、画面単位のプリファレンスとなる。

中身はこんな感じになってる
public SharedPreferences getPreferences(int mode) {
    return getSharedPreferences(getLocalClassName(), mode);
}

アプリグローバルのプリファレンス


PreferenceManagerクラスのgetDefaultSharedPreferences()で。
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
これで、アプリ(パッケージ)共通のプリファレンスになる。

中身はこんな感じ
    public static SharedPreferences getDefaultSharedPreferences(Context context) {
        return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
                getDefaultSharedPreferencesMode());
    }

    private static String getDefaultSharedPreferencesName(Context context) {
        return context.getPackageName() + "_preferences";
    }

    private static int getDefaultSharedPreferencesMode() {
        return Context.MODE_PRIVATE;
    }
で、パッケージ名のプリファレンスになるため、ドコから読んでも同じ設定ファイルになる。


値の保存

SharedPreferences#edit()で取得するEditorインスタンスに対して書き込みを行う。

こんな感じ
private String PREF_NAME = "name";
private String PREF_URL = "url";
private String PREF_SINCE = "since";
private String PREF_SSL = "usessl";

:

String name = "戯術者の日記";
String url = "http://www.jp-z.jp/changelog/";
long since = System.currentTimeMillis();
boolean use_ssl = false;

:

SharedPreferences pref = getPreferences(MODE_PRIVATE);	// SharedPreferencesインスタンスの取得は前述
Editor editor = pref.edit();

editor.putString(PREF_NAME, name);
editor.putString(PREF_URL, url);
editor.putLong(PREF_SINCE, since);
editor.putBoolean(PREF_SSL, use_ssl);
editor.commit();
値の設定は putType(キー, 値) でセット(Typeは値の型)し、commit()で変更を確定する。

出力される設定ファイルはこんな感じ
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="usessl" value="false" />
<string name="url">http://www.jp-z.jp/changelog/</string>
<string name="name">戯術者の日記</string>
<long name="since" value="1307539110435" />
</map>

値の取得

SharedPreferencesインスタンスのget系メソッドで取得する。

SharedPreferences pref = getPreferences(MODE_PRIVATE);
String name = pref.getString(PREF_NAME, "no name");
String url = pref.getString(PREF_URL, "no url");
long since = pref.getLong(PREF_SINCE, 0);
boolean usessl = pref.getBoolean(PREF_SSL, false);
型を間違えると ClassCastException が発生するので注意。
ちなみに、PreferenceActivity(設定画面)での併用をする場合、Integerでの書き込みはできないので、全部Stringで出力・取得する
[2011-07-04-1]

値のクリア

プリファレンス値が保存されたxmlファイル自体の消去は無いけど
SharedPreferences pref = getPreferences(MODE_PRIVATE);
Editor editor = pref.edit();
editor.clear();
editor.commit();
で、内容がクリアされる。
クリアされるとこんな感じに。
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map />



行数指定対応したので、引用したソースは行数を一致させた 2011-06-20
Referrer (Inside): [2011-07-03-1]
前のエントリ: 日付の取得・変換(java.util.Calendar / java.util.Date) [Java]
次のエントリ: 日記内の見出しに対応してみた [chalow]

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12