有没有办法动态显示和隐藏首选项?在我的例子中,我有一个复选框首选项,将禁用或启用2个首选项组(“有障碍”和“无障碍”组)之一。虽然这将是桌面环境中的理想GUI,但“有障碍”几乎占据了整个屏幕,而另一个“无障碍”只占屏幕的一小部分。我不想同时显示两个组,我想一次只显示其中一个,并在复选框改变时动态显示或隐藏这两个组。有办法做到这一点吗?
ijxebb2r1#
来自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属性。然后:
PreferenceScreen
PreferenceCategory
android:key
Preference somePreference = findPreference(SOME_PREFERENCE_KEY); PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference(SOME_PREFERENCE_CATEGORY_KEY); preferenceCategory.removePreference(somePreference);
以及:
preferenceCategory.addPreference(somePreference);
w1e3prcc2#
不完全是隐藏/显示,但如果您只想根据其他首选项禁用/启用首选项,则可以指定android:dependency="preferenceKey"或Preference.setDependency(String)示例来自developer.android.com:
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>
mpgws1up3#
我推荐使用V7 preference,它有setVisible()方法。但是我还没有试过。
setVisible()
ct3nt3jp4#
如果你想在首选项中完全隐藏首选项,这里有一个例子。但是不允许再次显示它。
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 }
vyswwuz25#
我需要类似的东西:切换一个开关来隐藏或显示两个额外的首选项。检查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; } });
hgb9j2n66#
为了动态地隐藏首选项,我创建了一个if条件,根据它的值来决定是否显示首选项。为了进行实际的隐藏,我使用了:
findPreference(getString(R.string.pref_key)).setLayoutResource(R.layout.hidden);
棘手的部分是让它再次可见。除了重新创建布局之外,没有直接的方法来做到这一点。如果if条件的值为false,这意味着pref应该是可见的,那么隐藏pref的代码将永远不会执行,从而导致一个可见的pref。下面是如何重新创建布局(在我的例子中,我扩展了一个PreferencesListFragment):
getActivity().recreate();
我希望这是有帮助的。
shstlldc7#
而不是在设置Activity的onCreate中执行此操作:
getSupportFragmentManager().beginTransaction() .replace(R.id.settings_container, new SettingsFragment()).commit();
您可以初始化设置片段的全局变量,并按如下方式设置:
settingsFragment = new SettingsFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.settings_container, settingsFragment).commit();
然后再往下,您可以使用全局SharedPreference.OnSharedPreferenceChangeListener设置OnSharedPreferenceChangeListener,以设置更改首选项时应显示或隐藏的内容:
// Global SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { if (key.equals("switch key")) { boolean newPref = preferences.getBoolean("switch key", true); settingsFragment.findPreference("seekbar key").setVisible(newPref); } } }; sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
然后在设置片段的onCreate中,您可以执行类似以下的操作来设置基于现有首选项应该隐藏的内容:
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext()); if (!sharedPreferences.getBoolean("switch key", true) { SeekBarPreference seekBarPreference = findPreference("seekbar key"); seekBarPreference.setVisible(false); }
7条答案
按热度按时间ijxebb2r1#
来自PreferenceActivity调用
您可以稍后拨打:
唯一有点棘手的部分是在重新添加时获得正确的顺序。有关详细信息,请查看PreferenceScreen文档,特别是它的基类PreferenceGroup。
**注:**以上操作仅适用于
PreferenceScreen
的直接子代。如果它们之间存在PreferenceCategory
,则需要从其父代PreferenceCategory
中删除首选项,而不是从PreferenceScreen
中删除首选项。首先,确保PreferenceCategory
在XML文件中设置了android:key
属性。然后:以及:
w1e3prcc2#
不完全是隐藏/显示,但如果您只想根据其他首选项禁用/启用首选项,则可以指定
android:dependency="preferenceKey"
或Preference.setDependency(String)
示例来自developer.android.com:
mpgws1up3#
我推荐使用V7 preference,它有
setVisible()
方法。但是我还没有试过。ct3nt3jp4#
如果你想在首选项中完全隐藏首选项,这里有一个例子。但是不允许再次显示它。
vyswwuz25#
我需要类似的东西:切换一个开关来隐藏或显示两个额外的首选项。检查Android-Support-Preference-V7-Fix的示例应用程序,它带来了一些新的首选项类型,并修复了官方库中的一些问题。有一个例子,切换复选框来显示或隐藏首选项类别。
在扩展PreferenceFragmentCompatDividers的片段中,您可以使用类似以下的内容:
hgb9j2n66#
为了动态地隐藏首选项,我创建了一个if条件,根据它的值来决定是否显示首选项。为了进行实际的隐藏,我使用了:
棘手的部分是让它再次可见。除了重新创建布局之外,没有直接的方法来做到这一点。如果if条件的值为false,这意味着pref应该是可见的,那么隐藏pref的代码将永远不会执行,从而导致一个可见的pref。下面是如何重新创建布局(在我的例子中,我扩展了一个PreferencesListFragment):
我希望这是有帮助的。
shstlldc7#
而不是在设置Activity的onCreate中执行此操作:
您可以初始化设置片段的全局变量,并按如下方式设置:
然后再往下,您可以使用全局SharedPreference.OnSharedPreferenceChangeListener设置OnSharedPreferenceChangeListener,以设置更改首选项时应显示或隐藏的内容:
然后在设置片段的onCreate中,您可以执行类似以下的操作来设置基于现有首选项应该隐藏的内容: