文字列設定の保存に問題があります。保存するためのこれらのユーティリティ メソッドがあります。
public static void putStringSet(SharedPreferences pref, Editor e, String key, Set<String> set)
{
if (Utils.isApiLevelGreaterThanGingerbread())
{
// e.remove(key); // I tried to remove it here
e.putStringSet(key, set);
}
else
{
// removes old occurences of key
for (String k : pref.getAll().keySet())
{
if (k.startsWith(key))
{
e.remove(k);
}
}
int i = 0;
for (String value : set)
{
e.putString(key + i++, value);
}
}
}
public static Set<String> getStringSet(SharedPreferences pref, String key, Set<String> defaultValue)
{
if (Utils.isApiLevelGreaterThanGingerbread())
{
return pref.getStringSet(key, defaultValue);
}
else
{
Set<String> set = new HashSet<String>();
int i = 0;
Set<String> keySet = pref.getAll().keySet();
while (keySet.contains(key + i))
{
set.add(pref.getString(key + i, ""));
i++;
}
if (set.isEmpty())
{
return defaultValue;
}
else
{
return set;
}
}
}
これらのメソッドを使用して、GB との下位互換性を維持しています。しかし、putStringSet メソッドの使用が API > ジンジャーブレッドに対して永続的ではないという問題があります。アプリの実行中は永続的です。しかし、再起動すると消えます。手順を説明します。
- アプリケーションのクリーン インストール - キー X の設定はありません
- キー X で文字列セット A を保存します - 設定には A が含まれます
- 文字列セット B をキー X で保存します - 設定には B が含まれます
- アプリを閉じる
- アプリの再起動 - 設定に A が含まれています
- 文字列セット C をキー X で保存します - 設定には C が含まれます
- アプリを閉じる
- アプリの再起動 - 設定に A が含まれています
したがって、最初の値のみが永続的であり、上書きすることはできません。
その他の注意事項:
- このメソッドは、putStringSet と getStringSet を置き換えるだけです。だから私は commit() を使用します...しかし、他の場所で (以下の例を参照)。
- commit() を apply() に置き換えようとしました - 成功しませんでした
- 新しい API で古い API のコードを使用すると (両方のメソッドで最初の 4 行をコメントしました)、問題なく動作しますが、それほど効率的ではありません。
使用例:
Editor e = mPref.edit();
PreferencesUtils.putStringSet(mPref, e, GlobalPreferences.INCLUDED_DIRECTORIES, dirs);
e.commit();
どうもありがとうございました。