Search code examples
androidandroid-preferencespreferenceactivity

How to show and hide preferences on Android dynamically?


Is there a way to dynamically show and hide preferences? In my case, I have a checkbox preference that would disable or enable one of 2 preference groups ("with-" and "without-handicap" groups). While this would be the ideal GUI in a desktop environment, the "with-handicap" takes up nearly the whole screen, while the other, "without-handicap" takes up only a small portion of the screen.

Rather than showing both groups at the same time, I'd like to show only one of them at a time, and dynamically show or hide the 2 groups when the checkbox changes. Is there a way to do this?


Solution

  • From a PreferenceActivity call

    Preference somePreference = findPreference(SOME_PREFERENCE_KEY);
    PreferenceScreen preferenceScreen = getPreferenceScreen();
    preferenceScreen.removePreference(somePreference);
    

    you can later call:

    preferenceScreen.addPreference(somePreference);
    

    The only a little bit tricky part is getting the order correct when adding back in. Look at PreferenceScreen documentation, particularly it's base class, PreferenceGroup for details.

    Note: The above will only work for immediate children of a PreferenceScreen. If there is a PreferenceCategory in between, you need to remove the preference from its parent PreferenceCategory, not the PreferenceScreen. First to ensure the PreferenceCategory has an android:key attribute set in the XML file. Then:

    Preference somePreference = findPreference(SOME_PREFERENCE_KEY);
    PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference(SOME_PREFERENCE_CATEGORY_KEY);
    preferenceCategory.removePreference(somePreference);
    

    and:

    preferenceCategory.addPreference(somePreference);