如何动态显示和隐藏Android上的首选项?

时间:2011-01-16 02:54:59

标签: android android-preferences preferenceactivity

有没有办法动态显示和隐藏首选项?在我的情况下,我有一个复选框首选项,可以禁用或启用2个首选项组之一(“with-”和“without-handicap”组)。虽然这将是桌面环境中理想的图形用户界面,但“带障碍”几乎占据整个屏幕,而另一个“无障碍”仅占用屏幕的一小部分。

我不是同时显示两个组,而是一次只显示其中一个组,并在复选框更改时动态显示或隐藏2个组。有没有办法做到这一点?

6 个答案:

答案 0 :(得分:60)

来自PreferenceActivity调用

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

您可以稍后致电:

preferenceScreen.addPreference(somePreference);

唯一有点棘手的部分是在重新添加时让订单正确。请查看PreferenceScreen文档,特别是它的基类PreferenceGroup以获取详细信息。

注意:以上内容仅适用于PreferenceScreen的直接子女。如果中间有PreferenceCategory,您需要从其父PreferenceCategory中删除偏好设置,而不是PreferenceScreen。首先确保PreferenceCategory在XML文件中设置了android:key属性。然后:

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

preferenceCategory.addPreference(somePreference);

答案 1 :(得分: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>

答案 2 :(得分:2)

我建议使用V7 preference,它有setVisible()方法。但我还没有尝试过。

答案 3 :(得分:0)

如果您想在Preference中完全隐藏首选项,这里有一个例子。但是,不允许再次显示它。

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
}

答案 4 :(得分:0)

我需要类似的东西:切换开关以隐藏或显示两个额外的偏好。查看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 时隐藏的两个首选项。

答案 5 :(得分:0)

为了动态隐藏首选项,我创建了一个if条件,我决定是否要让pref显示。为了实际隐藏,我一直在使用:

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

棘手的部分是让它再次可见。除了重新创建布局之外,没有直接的方法可以做到这一点。如果if条件的值为false,这意味着pref应该是可见的,那么隐藏pref的代码将永远不会被执行,从而产生可见的pref。以下是如何重新创建布局(在我的例子中,我正在扩展一个PreferencesListFragment):

    getActivity().recreate();

我希望这很有帮助。