Как показывать и скрывать предпочтения на Android динамически?

Есть ли способ динамически показывать и скрывать предпочтения? В моем случае у меня есть опция checkbox, которая отключит или включит одну из двух групп предпочтений (группы "with-" и "without-handicap" ). Хотя это был бы идеальный графический интерфейс в среде рабочего стола, "с гандикапом" занимает почти весь экран, в то время как другой "без гандикапа" занимает лишь небольшую часть экрана.

Вместо того, чтобы показывать обе группы одновременно, я хотел бы показывать только один из них за раз и динамически показывать или скрывать 2 группы при изменении флажка. Есть ли способ сделать это?

Ответ 1

От вызова PreferenceActivity

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

вы можете позже позвонить:

preferenceScreen.addPreference(somePreference);

Единственная немного сложная часть - это правильный порядок при добавлении обратно. Посмотрите PreferenceScreen документацию, особенно базовый класс, PreferenceGroup для деталей.

Ответ 2

Не совсем скрывать/показывать, но если вы хотите только отключить/включить предпочтение в зависимости от другого предпочтения, вы можете указать android:dependency="preferenceKey" или Preference.setDependency(String)

Пример из developer.android.com:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="pref_sync"
        android:title="@string/pref_sync"
        android:summary="@string/pref_sync_summ"
        android:defaultValue="true" />
    <ListPreference
        android:dependency="pref_sync"
        android:key="pref_syncConnectionType"
        android:title="@string/pref_syncConnectionType"
        android:dialogTitle="@string/pref_syncConnectionType"
        android:entries="@array/pref_syncConnectionTypes_entries"
        android:entryValues="@array/pref_syncConnectionTypes_values"
        android:defaultValue="@string/pref_syncConnectionTypes_default" />
</PreferenceScreen>

Ответ 3

Я рекомендую использовать предпочтение V7, имеет метод setVisible(). Но я еще не пробовал.

Ответ 4

Если вы хотите полностью реализовать скрытие предпочтения в Предпочтении, вот один пример. Однако это не позволяет сделать его видимым снова.

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
}