如何dynamic显示和隐藏Android上的偏好?

有没有办法dynamic显示和隐藏首选项? 在我的情况下,我有一个checkbox首选项,将禁用或启用2个偏好组(“with-”和“无障碍”组)之一。 虽然这将是桌面环境中理想的GUI,但“无障碍”几乎占据整个屏幕,而另一个“无障碍”占据屏幕的一小部分。

我不想同时显示两个组,我只想一次只显示其中的一个,并在checkbox更改时dynamic显示或隐藏这两个组。 有没有办法做到这一点?

Related of "如何dynamic显示和隐藏Android上的偏好?"

来自PreferenceActivity调用

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

你以后可以打电话给:

 preferenceScreen.addPreference(somePreference); 

唯一有点棘手的部分是在重新join时获得正确的顺序。查看PreferenceScreen文档,特别是它的基类PreferenceGroup 。

不完全隐藏/显示,但如果你只想根据另一个首选项禁用/启用首选项,你可以指定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> 

我推荐使用V7的偏好 ,它有setVisible()方法。 但是我还没有尝试过。

如果你想在首选项中完全隐藏偏好,下面是一个例子。 不过,不允许再次显示。

 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 }