4

現在の値に従ってListPreferenceの要約を変更する方法をまだ探しています。いくつかの調査の後、私はそれを(部分的に)機能させることができました:

 ListPreference pref = (ListPreference) findPreference("Repeat_PREFS");

    pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        public boolean onPreferenceChange(Preference preference, Object val) {

            ListPreference pref = (ListPreference) findPreference("Repeat_PREFS");

            pref.setSummary(pref.getEntry());
            return true;
        }

    });

問題は、初めて値を選択したときに、サマリーが他の値に変更されるか、まったく変更されないことです。2回目に同じ値を選択すると、サマリーが正しく設定されます。私は何が間違っているのですか?

4

2 に答える 2

6

設定の動作をアクティブ化する方法はありません。サマリーとして設定する値を使用してsetSummary()を呼び出す必要があります。たとえば、設定リスナーを使用します。

編集(質問の変更後...):Preference.OnPreferenceChangeListener新しい値が永続化される前に呼び出されるため、使用しないでください(http://developer.android.com/reference/android/preference/Preference.OnPreferenceChangeListener.htmlを参照) )したがって、設定値を最初に変更したときの動作。

またはに実装することをお勧めしOnSharedPreferenceChangeListenerます。(リスナーの登録と登録解除を忘れないでください。)このリスナーは、設定の変更が完了した後に呼び出されます。また、設定のXMLにデフォルト値を設定する必要があります。PreferenceFragmentPreferenceActivity

于 2012-09-12T10:56:01.497 に答える
1

レガシーコード用のSharedPreferencesOnSharedPreferenceChangeListenerの代替(すべてのリスナーを更新できない場合、またはSharedPreferencesとPreferencesを混在させたくない場合):

Preference.OnPreferenceChangeListenerを使用しますが、古い値を返すpreference.getEntry()は使用しないでください。代わりに、パラメータnewValueを介して新しい値を取得し、entryValues配列でそのインデックスを取得し、entrys配列でインデックスごとにエントリを取得します。

public OnPreferenceChangeListener prefListener = new OnPreferenceChangeListener() {

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        //Do not use lp.getEntry(), as it returns the old preference value before being changed
        //Read entry corresponding to entryValue newValue.
        ListPreference lPref = (ListPreference)preference;
        String newEntry = (String) lPref.getEntries()[lPref.findIndexOfValue(newValue.toString())];
        //Compose your summary as you need
        preference.setSummary(
            getResources().getString(
                R.string.myPref_summary, newEntry)); 
        return true;    //Persist new value
    }
};

これは確かにパフォーマンスにやさしいものではありませんが、何度も実行されない限り、自分に合う可能性があります。

于 2013-05-16T18:04:02.343 に答える