2016年2月6日土曜日

SharedPreferences

SharedPreferences

SharedPreferencesを用いてデータを保存する方法は2通りある。

その1.
Context.getSharedPreferences("thisName", Context.MODE_PRIVATE)を使う方法
簡単なサンプルは次のとおりです。
boolean b;
SharedPreferences sp;
sp = con.getSharedPreferences("thisName", Context.MODE_PRIVATE);
b = sp.getBoolean("thisKey", false);

その2.
PreferenceManager.getDefaultSharedPreferences()を使う方法
データを簡単に保存する方法(Preference編)

両者の違いは次のサイトに解説されている。
Difference between getDefaultSharedPreferences and getSharedPreferences
保存する名前(保存先)が異なるとのことである。機能に違いは無い。各々独立したデータとして取り扱うことになる。

仕掛け
Preferencesによるデータはファイルに保存される。
このファイル名は、Context.getSharedPreferences()であれば、その第一引数に指定した文字列になる。
PreferenceManager.getDefaultSharedPreferences()の場合は、context.getPackageName() + "_preferences"という、固定された名前(プログラマーが指定できない名前)になる。

このような名前を持つファイルの中に、任意の個数の、任意の名前のKeyが存在することになる。各々のKeyには、1個の何らかの値がくっついている。
Keyを指定することにより、値を操作することができる。

保存先がファイルであるから、複数設けるとアクセスに時間がかかるかもしれない。ファイルは1個にまとめれば効率的かもしれない。

PreferenceFragmentで使いたい場合
既にContext.getSharedPreferences()を用いてアプリを運用してしまっている場合であって、これをPreferenceFragmentで使用したい場合、取り扱うデータをContext.getSharedPreferences()で保存・読込ができるようにしなければならない。
\res\xml\preferences.xml
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <CheckBoxPreference
        android:key="ここにContext.getSharedPreferences()で使っているKeyを設定する"
        android:title="...."
        android:summary="...."
        >
    </CheckBoxPreference>
</PreferenceScreen>

PreferenceFragment.java
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        PreferenceManager pm;
        cbQuit = (CheckBoxPreference)findPreference("キー");
        pm = cbQuit.getPreferenceManager();
        pm.setSharedPreferencesName("名前");//取り扱うファイル名を変更する。
        boolean "値" = "変更後のファイルのキーから値を取得する"
        cbQuit.setChecked("値");

チェックボックスが1個だけなら良いが、2個以上の場合、onPreferenceChange()においてしっかりと値を保存しておかねばならない(意味不明)。
        pbQuit.setOnPreferenceChangeListener(this);
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue){
        if(preference==cbQuit){
            boolean b = (boolean)newValue;
            (ここで値を保存しておく)
            return true;
        }
        return false;
    }


0 件のコメント:

コメントを投稿