How to listen for preference changes within a PreferenceFragment?

前端 未结 9 2073
自闭症患者
自闭症患者 2020-11-28 19:16

As described here, I am subclassing PreferenceFragment and displaying it inside an Activity. That document explains how to listen for preference changes here, but only if yo

9条回答
  •  自闭症患者
    2020-11-28 19:39

    The solution of antew works well, here you can see a full preference activity for Android v11 onwards:

    import android.app.Activity;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
    import android.os.Bundle;
    import android.preference.ListPreference;
    import android.preference.PreferenceFragment;
    
    public class UserPreferencesV11 extends Activity  {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        // Display the fragment as the main content.
        getFragmentManager().beginTransaction().replace(android.R.id.content,
                new PrefsFragment()).commit();
    }
    
    public static class PrefsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.preferences);
    
            // set texts correctly
            onSharedPreferenceChanged(null, "");
    
        }
    
        @Override
        public void onResume() {
            super.onResume();
            // Set up a listener whenever a key changes
            getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
        }
    
        @Override
        public void onPause() {
            super.onPause();
            // Set up a listener whenever a key changes
            getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
        }
    
        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            // just update all
            ListPreference lp = (ListPreference) findPreference(PREF_YOUR_KEY);
            lp.setSummary("dummy"); // required or will not update
            lp.setSummary(getString(R.string.pref_yourKey) + ": %s");
    
        }
    }
    }
    

提交回复
热议问题