Как динамически отображать и скрывать настройки на Android? - PullRequest
29 голосов
/ 16 января 2011

Есть ли способ динамически отображать и скрывать настройки? В моем случае у меня есть флажок предпочтения, который отключает или включает одну из 2 групп предпочтений (группы «с -» и «без гандикапа»). В то время как это было бы идеальным графическим интерфейсом в среде рабочего стола, «with-handicap» занимает почти весь экран, в то время как другой «Without-Handicap» занимает только небольшую часть экрана.

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

Ответы [ 6 ]

62 голосов
/ 16 января 2011

Из вызова PreferenceActivity

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

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

preferenceScreen.addPreference(somePreference);

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

Примечание: Вышеуказанное будет работать только для непосредственных потомков PreferenceScreen,Если между ними стоит PreferenceCategory, вам нужно удалить предпочтение из родительского элемента PreferenceCategory, а не PreferenceScreen.Сначала убедитесь, что PreferenceCategory имеет атрибут android:key, установленный в файле XML.Тогда:

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

и:

preferenceCategory.addPreference(somePreference);
2 голосов
/ 09 июня 2017

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

2 голосов
/ 08 октября 2015

Не совсем скрытие / отображение, но если вы хотите только отключить / включить предпочтение в зависимости от другого предпочтения, вы можете указать 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>
0 голосов
/ 11 мая 2018

Для динамического сокрытия предпочтений я создал условие if, для которого я решаю, хочу ли показывать преф или нет.Чтобы сделать фактическое сокрытие, я использовал:

    findPreference(getString(R.string.pref_key)).setLayoutResource(R.layout.hidden);

Сложная задача - сделать его снова видимым.Нет прямого способа сделать это, кроме как воссоздать макет.Если значение условия if равно false, что означает, что преф должен быть видимым, тогда код, скрывающий преф, никогда не будет выполнен, что приведет к видимому префу.Вот как воссоздать макет (в моем случае я расширяю PreferencesListFragment):

    getActivity().recreate();

Надеюсь, это было полезно.

0 голосов
/ 05 января 2018

Мне нужно было что-то похожее: переключить переключатель, чтобы скрыть или показать два дополнительных предпочтения. Посмотрите пример приложения из Android-Support-Preference-V7-Fix , в котором представлены некоторые новые типы настроек и исправлены некоторые проблемы из официальной библиотеки. Там есть пример, чтобы установить флажок, чтобы показать или скрыть категорию предпочтений.

Во фрагменте, который расширяет PreferenceFragmentCompatDividers, вы можете использовать что-то вроде:

findPreference("pref_show_extra_stuff").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            findPreference("pref_extra_stuff_01").setVisible((Boolean) newValue);
            findPreference("pref_extra_stuff_02").setVisible((Boolean) newValue);
            return true;
        }
    });

pref_extra_stuff_01 и pref_extra_stuff_02 - это два параметра, которые скрываются при переключении pref_show_extra_stuff .

0 голосов
/ 28 апреля 2017

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

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
}
...