我有一个扩展PreferenceActivity的活动。 我正在从xml文件加载首选项。 但在某些情况下,我需要根据我的应用程序状态完全隐藏屏幕上的某个偏好设置。有一个setEnabled方法,但它不完全是我想要的。我想从屏幕上完全删除该偏好。 这可能吗?删除/隐藏屏幕上的偏好
回答
如果您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);
公平地说,上面的答案确实表明你需要父类'PreferenceCategory'。 – matt 2014-06-06 00:09:28
如喜好是个人偏好屏幕的直接子的情况下,这里是一些独立的代码:
PreferenceScreen screen = getPreferenceScreen();
Preference pref = getPreferenceManager().findPreference("mypreference");
screen.removePreference(pref);
如果首选项位于类别内,则无法使用。您必须为该类别设置'findPreference',并从类别 – MBH 2017-09-10 14:34:53
@MBH中删除偏好:感谢您提及该警告! – 2017-09-11 03:49:35
如果你想要的东西,会动态改变首选项例如在SwitchPreference ,我发现最好的方法是将我所有的子选项放入两个类别容器中。最初你会看到所有的东西,然后你只删除你不想要的东西。聪明的一点是,当事情发生变化时,您只需触发重新创建,然后您就不必手动创建任何内容或担心按照正确的顺序重新排列。
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();
}
}
我可以看到的唯一缺点就是屏幕是从头开始重新创建的。
如果要评估,并基于该面膜,另一种可能是/(SI deseas evaluar,Y带基地ESO 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);
}
这一切都必须是内/(待办事项ESTO德贝IR迪登特鲁):
公共静态类PrefsFragment扩展PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
对不起,但这是一个英文网站。你能用英语回答吗? – 2016-05-13 00:04:56
当然我的意图也是为那些不会说英语的人提供 – 2016-05-13 14:05:06
@GustavoEduardoBelduma,那么你可能需要阅读这个http://meta.stackoverflow.com/a/297680/545026 – 2016-07-28 19:33:29
下面是做到这一点的通用方式,作品不论是否偏好是在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)
在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
- 1. Android偏好屏幕偏好设置
- 2. 我的偏好屏幕上的滑块
- 3. 如何从屏幕中删除Android偏好设置
- 4. 如何隐藏屏幕上的补丁
- 5. 在屏幕键盘上隐藏内容
- 6. 在小屏幕上隐藏TextView
- 7. 在响应式屏幕上隐藏div
- 8. 在屏幕上隐藏div ID
- 9. 隐藏SlidingDrawer在屏幕上点击
- 10. Android的偏好屏幕布局
- 11. 隐藏屏幕睡眠
- 12. jquery屏幕隐藏/显示
- 13. 隐藏Phonegap spash屏幕
- 14. 隐藏屏幕SVG元素
- 15. Bootstrap 4 - 隐藏课程 - 只隐藏在小屏幕上
- 16. 躲在偏好屏幕(机器人)
- 17. 解决xml偏好屏幕问题
- 18. 偏好屏幕显示文本块
- 19. 在plone用户偏好中隐藏“个人偏好选项卡”
- 20. 从屏幕上删除打印的行
- 21. 删除屏幕上的多边形(OpenGL)?
- 22. 如何从SugarCRM中的登录屏幕中删除或隐藏全局链接?
- 23. 屏幕阅读器的隐藏目录
- 24. 隐藏屏幕底部的div吗?
- 25. 隐藏预载屏幕后的内容
- 26. 隐藏Excel 2010中的MS VBA屏幕
- 27. 隐藏窗口的屏幕截图
- 28. 从屏幕上删除精灵
- 29. 隐藏在垂直屏幕上的隐藏面板调整大小
- 30. 偏好不以编程方式显示在子屏幕上
我很好奇这一点。 – 2010-02-10 21:05:23