Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Refresh android PreferenceFragment

I have a CheckBoxPreference in a FragmentPreference. When the user active the check box, I check if an application is installed and if not, I reset the preference on false and I open the Play Store to download the app.

Basically all works fine, but I have an issue to refresh the UI. Indeed, even if I set the preference on false before opened the Play Store, when the user come back, the box is checked (the fragment has just been paused and resumed so the preference value is ignored).

Is there a way to "refresh" the activity or the fragment?

like image 932
FabiF Avatar asked Aug 10 '12 14:08

FabiF


1 Answers

Make your PreferenceFragment implement the OnSharedPreferenceChangeListener interface.

In onCreate(), you can read the preference value and set the UI accordingly. For instance:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load the preferences from an XML resource.
    addPreferencesFromResource(R.xml.shakesql_app_prefs);

    // Initialize pref summary label.

    // Get a reference to the application default shared preferences.
    SharedPreferences sp = getPreferenceScreen().getSharedPreferences();

    // Read the current preference value.
    String listVal =
            sp.getString(getString(R.string.preference_font_size_key),
                    getString(R.string.preference_font_size_default));

    // Look up the textual description corresponding to the
    // preference value and write it into the summary field.
    String listDesc = descriptionFromPref(
            listVal, 
            getResources().getStringArray(
                    R.array.preference_font_size_values), 
                    getResources().getStringArray(
                            R.array.preference_font_size_labels)
                    );
    if (!TextUtils.isEmpty(listDesc)) {
        ListPreference listPref =
                (ListPreference) findPreference(getString(R.string.preference_font_size_key));
        listPref.setSummary(listDesc);
    }
}

Then, in onSharedPreferenceChanged(), update the UI.

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference pref = findPreference(key);
    if (pref instanceof ListPreference) {
        // Update display title
        // Write the description for the newly selected preference 
        // in the summary field.
        ListPreference listPref = (ListPreference) pref;
        CharSequence listDesc = listPref.getEntry();
        if (!TextUtils.isEmpty(listDesc)) {
            pref.setSummary(listDesc);
        }
    }        
}

Here's a code snippet from the AdvancedPreferences sample in API Demos to force the value of a checkbox preference.

// Toggle the value of mCheckBoxPreference.
if (mCheckBoxPreference != null) {
            mCheckBoxPreference.setChecked(!mCheckBoxPreference.isChecked());
}
like image 78
Sparky Avatar answered Sep 27 '22 18:09

Sparky