2

いくつPreferenceFragmentかの異なるアイテムの同じ設定を変更するために使用される があります。明らかに、アイテムごとに設定値を異なるキーで保存する必要があります。そのため、フラグメントの作成後にすべての設定のキーを変更します。

設定は、通常どおり xml によって定義されます。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="_key_one"
        android:title="Title of first preference" />
    [... and more Preferences]
</PreferenceScreen>

キーを変更する PreferenceFragment:

public class ItemSettingPreferenceFragment extends PreferenceFragment {

    private String mItemKey;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mItemKey = getArguments().getString('item_key');     //this will contain name of item
        addPreferencesFromResource(R.xml.item_settings_preferences);
        for (int i=0; i< getPreferenceScreen().getPreferenceCount(); i++){
            final Preference pref = getPreferenceScreen().getPreference(i);
            pref.setKey(mItemKey + pref.getKey());
        }
    }
}

現在、すべての環境設定には、「item1_key_one」のようなアイテムごとに一意のキーがあります
残念ながら、作成後、これらの環境設定は元のキー「_key_one」で値をロードして表示します

新しいキーの値をリロードして表示するように設定を強制するにはどうすればよいですか?

4

3 に答える 3

2

関連する Preference クラスをすべて読んだ後、簡単な解決策を見つけました。設定のリロードを許可するパブリック メソッドがないため、リフレクションを使用する必要があります。
呼び出さなければならない必要なメソッドは、サブクラスprotected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue)内で見つかるPreference.classか、サブクラスによってオーバーライドされます。
どのスーパークラスがこのメソッドを実装しているか分からないので、すべてのスーパークラスを反復処理し、成功するまでメソッドを見つけて呼び出す必要があります。

public class ItemSettingPreferenceFragment extends PreferenceFragment {

    private String mItemKey;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mItemKey = getArguments().getString('item_key');     //this will contain name of item
        addPreferencesFromResource(R.xml.item_settings_preferences);
        for (int i=0; i< getPreferenceScreen().getPreferenceCount(); i++){
            Preference pref = getPreferenceScreen().getPreference(i);
            pref.setKey(mItemKey + pref.getKey());

            Class iterClass = pref.getClass();
            while(iterClass != Object.class) {
                try {
                    Method m = iterClass.getDeclaredMethod("onSetInitialValue", boolean.class, Object.class);
                    m.setAccessible(true);
                    m.invoke(pref, true, null);
                } catch (Exception e) { }
                iterClass = iterClass.getSuperclass();
            }
        }
    }
}

これは最もパフォーマンスの高いソリューションではないかもしれませんが、私の場合は問題なく機能します。

于 2013-07-15T23:06:25.910 に答える
0

最も簡単な解決策は、個別の設定名を使用することです。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getPreferenceManager().setSharedPreferencesName("MyPrefs_" + someSufix);
    addPreferencesFromResource(R.xml.pref_my);
}

キー値にプレフィックスを付ける代わりに。

于 2015-02-05T21:16:56.997 に答える