How to show and hide preferences on Android dynamically?

后端 未结 6 796
隐瞒了意图╮
隐瞒了意图╮ 2020-12-23 17:46

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 \"w

6条回答
  •  旧时难觅i
    2020-12-23 18:21

    If you want to implement the hiding of the preference completely in the Preference, here is one example. Does not allow to make it visible again, though.

    public class RemovablePreference extends Preference {
    
    @Override
    protected void onBindView(View view) {
        super.onBindView(view);
    
        updateVisibility(); // possibly a better place available?
    }
    
    private void updateVisibility() {
        Context context = getContext(); // should be a PreferenceActivity
        if (context instanceof PreferenceActivity) {
            updateVisibility((PreferenceActivity)context);
        }
    }
    
    private void updateVisibility(PreferenceActivity activity) {
        updateVisibility(getPreferenceScreen(activity));
    }
    
    private PreferenceScreen getPreferenceScreen(PreferenceActivity activity) {
    
        if (activity.getPreferenceScreen() != null) {
            return activity.getPreferenceScreen(); // for old implementations
        }
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            Fragment fragment = activity.getFragmentManager().findFragmentById(android.R.id.content);
            if (fragment instanceof PreferenceFragment) {
                return ((PreferenceFragment) fragment).getPreferenceScreen();
            }
        }
        return null;
    }
    
    private void updateVisibility(PreferenceScreen screen) {
        if (!isVisible() && screen != null) {
            hidePreference(screen, this);
        }
    }
    
    private boolean hidePreference(PreferenceGroup prefGroup, Preference removedPreference) {
        boolean removed = false;
    
        if (prefGroup.removePreference(removedPreference)) {
            removed = true;
        }
    
        for (int i = 0; i < prefGroup.getPreferenceCount(); i++) {
            Preference preference = prefGroup.getPreference(i);
            if (preference instanceof PreferenceGroup) {
                PreferenceGroup prefGroup2 = (PreferenceGroup)preference;
                if (hidePreference(prefGroup2, this)) {
                    // The whole group is now empty -> remove also the group
                    if (prefGroup2.getPreferenceCount() == 0) {
                        removed = true;
                        prefGroup.removePreference(prefGroup2);
                    }
                }
            }
        }
    
        return removed;
    }
    
    protected boolean isVisible() {
        return true; // override
    }
    

提交回复
热议问题