有没有办法动态显示和隐藏偏好?就我而言,我有一个复选框首选项,它将禁用或启用 2 个首选项组(“with-”和“without-handicap”组)之一。虽然这将是桌面环境中的理想 GUI,但“有障碍”几乎占据了整个屏幕,而另一个“无障碍”只占据了屏幕的一小部分。
我不想同时显示两个组,而是一次只显示其中一个,并在复选框更改时动态显示或隐藏这两个组。有没有办法做到这一点?
有没有办法动态显示和隐藏偏好?就我而言,我有一个复选框首选项,它将禁用或启用 2 个首选项组(“with-”和“without-handicap”组)之一。虽然这将是桌面环境中的理想 GUI,但“有障碍”几乎占据了整个屏幕,而另一个“无障碍”只占据了屏幕的一小部分。
我不想同时显示两个组,而是一次只显示其中一个,并在复选框更改时动态显示或隐藏这两个组。有没有办法做到这一点?
从 PreferenceActivity 调用
Preference somePreference = findPreference(SOME_PREFERENCE_KEY);
PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.removePreference(somePreference);
您可以稍后致电:
preferenceScreen.addPreference(somePreference);
唯一有点棘手的部分是在重新添加时使顺序正确。查看PreferenceScreen文档,特别是它的基类PreferenceGroup以获取详细信息。
注意:以上内容仅适用于 a 的直系子级PreferenceScreen
。如果PreferenceCategory
介于两者之间,则需要从其父级中删除首选项PreferenceCategory
,而不是PreferenceScreen
. 首先确保在 XML 文件中设置PreferenceCategory
了android:key
属性。然后:
Preference somePreference = findPreference(SOME_PREFERENCE_KEY);
PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference(SOME_PREFERENCE_CATEGORY_KEY);
preferenceCategory.removePreference(somePreference);
和:
preferenceCategory.addPreference(somePreference);
不完全隐藏/显示,但如果您只想根据另一个首选项禁用/启用首选项,您可以指定android:dependency="preferenceKey"
或Preference.setDependency(String)
<?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()
方法。但我还没有尝试过。
如果要在 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
}
为了动态隐藏首选项,我创建了一个 if 条件,我根据其值决定是否要显示首选项。为了进行实际隐藏,我一直在使用:
findPreference(getString(R.string.pref_key)).setLayoutResource(R.layout.hidden);
棘手的部分是让它再次可见。除了重新创建布局之外,没有直接的方法可以做到这一点。如果 if-condition 的值为 false,这意味着 pref 应该是可见的,那么隐藏 pref 的代码将永远不会被执行,从而导致可见的 pref。以下是如何重新创建布局(在我的例子中,我正在扩展 PreferencesListFragment):
getActivity().recreate();
我希望这会有所帮助。
我需要类似的东西:切换开关以隐藏或显示两个额外的偏好。查看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时隐藏的两个首选项。