2010-02-10 122 views
112

我有一个扩展PreferenceActivity的活动。 我正在从xml文件加载首选项。 但在某些情况下,我需要根据我的应用程序状态完全隐藏屏幕上的某个偏好设置。有一个setEnabled方法,但它不完全是我想要的。我想从屏幕上完全删除该偏好。 这可能吗?删除/隐藏屏幕上的偏好

+1

我很好奇这一点。 – 2010-02-10 21:05:23

回答

153

是的,如果你有一个参照这两个Preference,与其父(一PreferenceCategory,或PreferenceScreen

myPreferenceScreen.removePreference(myPreference); 
+0

谢谢 - 完全有效。 – 2010-02-10 22:36:56

+0

太棒了!谢谢!作品并做出完美的感觉 – Bostone 2012-02-26 18:35:13

+0

我可能通过这个回答了我自己的问题? http://stackoverflow.com/a/4704360/956975 – marienke 2017-02-23 11:58:24

180

如果您PreferencePreferenceCategory内,你必须这样做:

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); 
+2

公平地说,上面的答案确实表明你需要父类'PreferenceCategory'。 – matt 2014-06-06 00:09:28

43

如喜好是个人偏好屏幕的直接子的情况下,这里是一些独立的代码:

PreferenceScreen screen = getPreferenceScreen(); 
Preference pref = getPreferenceManager().findPreference("mypreference"); 
screen.removePreference(pref); 
+3

如果首选项位于类别内,则无法使用。您必须为该类别设置'findPreference',并从类别 – MBH 2017-09-10 14:34:53

+1

@MBH中删除偏好:感谢您提及该警告! – 2017-09-11 03:49:35

7

如果你想要的东西,会动态改变首选项例如在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(); 
    } 
} 

我可以看到的唯一缺点就是屏幕是从头开始重新创建的。

+0

这种情况不起作用,至少不会在22年。但将其改为偏好(即使它是一组偏好)也行。 – Rob 2015-04-02 16:21:03

+0

Rob,我刚刚在API22 AVD中测试了上面的代码,它工作的很好。确保您的首选XML内容符合您的代码。对于上述示例,SwitchPreference可以位于任何位置,但您需要PreferenceCategorys作为PreferenceScreen的直接子节点。 – James 2015-04-02 20:46:41

+0

我刚刚将类别设置为偏好设置,不投射并删除它。工作。 – Rob 2015-04-03 01:14:21

0

如果要评估,并基于该面膜,另一种可能是/(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); 
+1

对不起,但这是一个英文网站。你能用英语回答吗? – 2016-05-13 00:04:56

+0

当然我的意图也是为那些不会说英语的人提供 – 2016-05-13 14:05:06

+1

@GustavoEduardoBelduma,那么你可能需要阅读这个http://meta.stackoverflow.com/a/297680/545026 – 2016-07-28 19:33:29

0

下面是做到这一点的通用方式,作品不论是否偏好是在PreferenceCategoryPreferenceScreen之下。

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; 
} 
2

在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