Как динамически отображать и скрывать настройки на Android?

GCC имеет [приблизительно 110] созданные-ins для атомарных доступов , также.

31
задан spaaarky21 25 October 2013 в 16:48
поделиться

2 ответа

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

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

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

    getActivity().recreate();

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

0
ответ дан 27 November 2019 в 21:56
поделиться

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

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
}
0
ответ дан 27 November 2019 в 21:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: