2010-02-10 21 views
112

मेरे पास एक ऐसी गतिविधि है जो वरीयता सक्रियता को बढ़ाती है। मैं xml फ़ाइल से वरीयताओं को लोड कर रहा हूं। लेकिन कुछ मामलों में मुझे अपने ऐप स्थिति के आधार पर स्क्रीन से वरीयताओं में से एक को पूरी तरह छिपाने की ज़रूरत है। एक सेट सक्षम विधि है, लेकिन यह वही नहीं है जो मैं चाहता हूं। मैं स्क्रीन से उस वरीयता को पूरी तरह से हटाना चाहता हूं। क्या यह संभव है?स्क्रीन से प्राथमिकता को हटाएं/छुपाएं

+1

मैं भी इस बारे में उत्सुक हूँ। –

उत्तर

153

हाँ, यदि आप

myPreferenceScreen.removePreference(myPreference); 
+0

धन्यवाद - पूरी तरह से काम करता है। –

+0

बढ़िया! धन्यवाद!काम करता है और सही मायने रखता है – Bostone

+0

मैंने इस के माध्यम से अपने स्वयं के प्रश्न का उत्तर दिया होगा? http://stackoverflow.com/a/4704360/956975 – marienke

180

(PreferenceScreen एक PreferenceCategory, या) के लिए एक संदर्भ दोनों Preference, और उसकी मूल है, तो अपने Preference एक PreferenceCategory में है, तो यह करने के लिए है:

एक्सएमएल:

<PreferenceCategory 
    android:key="category_foo" 
    android:title="foo"> 

<CheckBoxPreference 
    android:key="checkPref" /> 

जावा:

+०१२३५१६४१०
CheckBoxPreference mCheckBoxPref = (CheckBoxPreference) findPreference("checkPref"); 
PreferenceCategory mCategory = (PreferenceCategory) findPreference("category_foo"); 
mCategory.removePreference(mCheckBoxPref); 
+2

निष्पक्ष होने के लिए, उपर्युक्त उत्तर कहता है कि आपको मूल 'प्राथमिकता श्रेणी' की आवश्यकता है। – matt

43

मामले में जहां पसंद वरीयता स्क्रीन का एक सीधा बच्चा है, यहाँ कुछ स्टैंड-अलोन कोड है:

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

यदि प्राथमिकता श्रेणी के भीतर स्थित है तो यह काम नहीं करेगा। आपको श्रेणी के लिए 'प्राप्यता' ढूंढनी है, और श्रेणी – MBH

+1

@MBH से वरीयता को हटा देना है: उस चेतावनी का उल्लेख करने के लिए धन्यवाद! –

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

+0

रोब, मैंने अभी एपीआई 22 एवीडी में उपरोक्त कोड का परीक्षण किया है और यह ठीक काम कर रहा है। सुनिश्चित करें कि आपकी वरीयता एक्सएमएल सामग्री आपके कोड से मेल खाती है। उपर्युक्त उदाहरण के लिए SwitchPreference कहीं भी हो सकता है, लेकिन आपको वरीयता श्रेणी की प्राथमिकताएं होने के लिए वरीयता श्रेणियों की आवश्यकता है। – James

+0

मुझे अभी श्रेणी को प्राथमिकता, कोई कलाकार नहीं मिला है, और इसे हटा दिया गया है। काम किया। – Rob

0

आप मूल्यांकन करना चाहते हैं, और कहा कि मुखौटा के आधार पर, एक विकल्प हो सकता है/(सी deseas evaluar, वाई एन आधार एक eso Ocultar, ऊना 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 Dentro):

सार्वजनिक स्थैतिक कक्षा PrefsFragment फैली PreferenceFragment {

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
+1

क्षमा करें, लेकिन यह एक अंग्रेजी साइट है। क्या आप अंग्रेजी में जवाब दे सकते हैं? –

+0

बेशक मेरा इरादा उन लोगों को भी प्रदान करना था जो अंग्रेजी नहीं बोलते –

+1

@ गुस्तावोएडर्डोबेल्डुमा तो आपको यह http://meta.stackoverflow.com/a/297680/545026 पढ़ने की आवश्यकता हो सकती है –

0

यहाँ यह करने के लिए एक सामान्य तरीका है कि भले काम करता है वरीयता 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; 
} 
2

के बजाय PreferenceFragment उपयोग करने के लिए अपने एक्सएमएल फ़ाइल में है:

<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 
संबंधित मुद्दे