从屏幕上删除/隐藏偏好设置
我有一个扩展PreferenceActivity的活动。 我正在从XML文件加载首选项。 但在某些情况下,我需要从屏幕上根据我的应用程序状态完全隐藏其中一个首选项。 有一个setEnabled方法,但它不完全是我想要的。 我想完全从屏幕上删除该偏好。 可能吗 ?
是的,如果您对Preference
及其父项( PreferenceCategory
或PreferenceScreen
)都有参考,
myPreferenceScreen.removePreference(myPreference);
如果您的Preference
在PreferenceCategory
,则必须这样做:
XML:
<PreferenceCategory android:key="category_foo" android:title="foo"> <CheckBoxPreference android:key="checkPref" />
Java的:
CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref"); PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo"); mCategory.removePreference(mCheckBoxPref);
在首选项是首选项屏幕的直接子项的情况下,这是一些独立的代码:
PreferenceScreen screen = getPreferenceScreen(); Preference pref = getPreferenceManager().findPreference("mypreference"); screen.removePreference(pref);
如果你想要的东西,将dynamic改变首选项,例如在一个SwitchPreference,我发现最好的办法是把我所有的子选项到两个类别容器。 最初你会看到所有的东西,然后你删除你不想要的东西。 聪明的一点是,当某些事情发生变化时,你只需触发重新创build,然后你就不必手动创build任何东西,也不用担心把事情按正确的顺序放回去。
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); PreferenceCategory prefCatOne= (PreferenceCategory)findPreference("prefCatOne"); PreferenceCategory prefCatTwo= (PreferenceCategory)findPreference("prefCatTwo"); SwitchPreference mySwitchPref= (SwitchPreference)findPreference("mySwitchPref"); PreferenceScreen screen = getPreferenceScreen(); if (mySwitchPref.isChecked()) { screen.removePreference(prefCatOne); } else { screen.removePreference(prefCatTwo); } } public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { if (key.equals("mySwitchPref")) { this.recreate(); } }
唯一的缺点,我可以看到这一点,是有一个闪光的屏幕从头开始重新创build。
在你的XML文件中:
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:key="preferenceScreen"> <PreferenceCategory android:key="personalisation" android:title="your title here"> <ThemedPreference android:key="animation" /> </PreferenceScreen>
在你的代码中:
PreferenceScreen pPreferenceScreen = (PreferenceScreen) findPreference("preferenceScreen"); PreferenceCategory pCategory = (PreferenceCategory) findPreference("personalisation"); ThemedPreference pThemePref = (ThemedPreference) findPreference("animation"); pPreferenceScreen.removePreference(pCategory); //remove category pCategory.removePreference(pThemePref); // remove preference
如果你想评估,并基于这个面具,一个替代scheme可能是/(Si deseas评估,y en基于一个ocultar,una alternativa puede ser):
SwitchPreference autenticacionUsuario = (SwitchPreference) findPreference("key_autenticacion_usuario"); final EditTextPreference Username = (EditTextPreference) findPreference("key_username_mqtt"); final EditTextPreference Password = (EditTextPreference) findPreference("key_password_mqtt"); if (!autenticacionUsuario.isChecked()) { PreferenceCategory preferenceCategory = (PreferenceCategory) findPreference("category_mqtt"); preferenceCategory.removePreference(Username); preferenceCategory.removePreference(Password); }
所有这一切都必须在/(Todo esto debe ir dentro):
公共静态类PrefsFragment扩展PreferenceFragment {
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
这是一个通用的方法来做到这一点,无论偏好是在PreferenceCategory
或PreferenceScreen
。
private void removePreference(Preference preference) { PreferenceGroup parent = getParent(getPreferenceScreen(), preference); if (parent == null) throw new RuntimeException("Couldn't find preference"); parent.removePreference(preference); } private PreferenceGroup getParent(PreferenceGroup groupToSearchIn, Preference preference) { for (int i = 0; i < groupToSearchIn.getPreferenceCount(); ++i) { Preference child = groupToSearchIn.getPreference(i); if (child == preference) return groupToSearchIn; if (child instanceof PreferenceGroup) { PreferenceGroup childGroup = (PreferenceGroup)child; PreferenceGroup result = getParent(childGroup, preference); if (result != null) return result; } } return null; }
我推荐使用V7的偏好,它有setVisible()方法。 但是我还没有尝试过。 因此,您必须使用PreferenceFragment而不是PreferenceActivity https://developer.android.google.cn/reference/android/support/v7/preference/Preference.html#setVisible(boolean);