2010-02-10 123 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