2011-01-16 6 views
24

क्या गतिशील रूप से वरीयताओं को दिखाने और छिपाने का कोई तरीका है? मेरे मामले में, मेरे पास एक चेकबॉक्स वरीयता है जो 2 वरीयता समूहों में से एक को अक्षम या सक्षम करेगी ("साथ-" और "बिना-विकलांग" समूह)। हालांकि यह डेस्कटॉप वातावरण में आदर्श जीयूआई होगा, "साथ-साथ" लगभग पूरी स्क्रीन लेता है, जबकि दूसरा, "बिना विकलांगता" स्क्रीन का केवल एक छोटा सा हिस्सा लेता है।एंड्रॉइड पर गतिशील रूप से वरीयताओं को कैसे दिखाएं और छुपाएं?

एक ही समय में दोनों समूहों को दिखाने की बजाय, मैं एक समय में केवल उनमें से एक को दिखाना चाहता हूं, और चेकबॉक्स में परिवर्तन होने पर 2 समूहों को गतिशील रूप से दिखा या छुपाएं। क्या इसे करने का कोई तरीका है?

+0

से भी http://stackoverflow.com/questions/2240326/remove-hide-a-preference-from-the-screen एक बेहतर जवाब के लिए , मामले में आप श्रेणियों का उपयोग कर रहे हैं। – Eyal

उत्तर

54

एक PreferenceActivity कॉल से

Preference somePreference = findPreference(SOME_PREFERENCE_KEY); 
PreferenceScreen preferenceScreen = getPreferenceScreen(); 
preferenceScreen.removePreference(somePreference); 

तुम्हें बाद में फोन कर सकते हैं:।

preferenceScreen.addPreference(somePreference); 

केवल एक छोटा सा मुश्किल हिस्सा सही क्रम हो रही है जब में जोड़ PreferenceScreen प्रलेखन को देखो, विशेष रूप से विवरण के लिए यह बेस क्लास, PreferenceGroup है।

+0

Grr, मुझे लगता है कि एंड्रॉइड में कोई भी "दृश्यमान" विकल्प नहीं है। जवाब के लिए धन्यवाद। – Japtar

+1

कुछ वरीयता को हटाने के बाद 'findPreference()' रिटर्न 'नल' पर दूसरी कॉल, इसे फिर से कैसे जोड़ें? –

+6

@ मिकी टिन: जब आप इसे पाते हैं तो क्लास सदस्य के रूप में उपरोक्त वरीयता (कुछ प्राथमिकता) को बचाएं, फिर आप इसे हटाकर जोड़ सकते हैं। – dhaag23

2

नहीं वास्तव में छुपा/दिखा लेकिन यदि आप केवल अक्षम करने करना चाहते हैं/एक और प्राथमिकता के आधार पर वरीयता सक्षम करने से आप निर्दिष्ट कर सकते हैं android:dependency="preferenceKey" या Preference.setDependency(String)

उदाहरण developer.android.com से:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <CheckBoxPreference 
     android:key="pref_sync" 
     android:title="@string/pref_sync" 
     android:summary="@string/pref_sync_summ" 
     android:defaultValue="true" /> 
    <ListPreference 
     android:dependency="pref_sync" 
     android:key="pref_syncConnectionType" 
     android:title="@string/pref_syncConnectionType" 
     android:dialogTitle="@string/pref_syncConnectionType" 
     android:entries="@array/pref_syncConnectionTypes_entries" 
     android:entryValues="@array/pref_syncConnectionTypes_values" 
     android:defaultValue="@string/pref_syncConnectionTypes_default" /> 
</PreferenceScreen> 
0

आप छुपा लागू करना चाहते हैं प्राथमिकता में वरीयता में पूरी तरह से, यहां एक उदाहरण है। हालांकि, इसे फिर से दिखने की अनुमति नहीं है।

public class RemovablePreference extends Preference { 

@Override 
protected void onBindView(View view) { 
    super.onBindView(view); 

    updateVisibility(); // possibly a better place available? 
} 

private void updateVisibility() { 
    Context context = getContext(); // should be a PreferenceActivity 
    if (context instanceof PreferenceActivity) { 
     updateVisibility((PreferenceActivity)context); 
    } 
} 

private void updateVisibility(PreferenceActivity activity) { 
    updateVisibility(getPreferenceScreen(activity)); 
} 

private PreferenceScreen getPreferenceScreen(PreferenceActivity activity) { 

    if (activity.getPreferenceScreen() != null) { 
     return activity.getPreferenceScreen(); // for old implementations 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     Fragment fragment = activity.getFragmentManager().findFragmentById(android.R.id.content); 
     if (fragment instanceof PreferenceFragment) { 
      return ((PreferenceFragment) fragment).getPreferenceScreen(); 
     } 
    } 
    return null; 
} 

private void updateVisibility(PreferenceScreen screen) { 
    if (!isVisible() && screen != null) { 
     hidePreference(screen, this); 
    } 
} 

private boolean hidePreference(PreferenceGroup prefGroup, Preference removedPreference) { 
    boolean removed = false; 

    if (prefGroup.removePreference(removedPreference)) { 
     removed = true; 
    } 

    for (int i = 0; i < prefGroup.getPreferenceCount(); i++) { 
     Preference preference = prefGroup.getPreference(i); 
     if (preference instanceof PreferenceGroup) { 
      PreferenceGroup prefGroup2 = (PreferenceGroup)preference; 
      if (hidePreference(prefGroup2, this)) { 
       // The whole group is now empty -> remove also the group 
       if (prefGroup2.getPreferenceCount() == 0) { 
        removed = true; 
        prefGroup.removePreference(prefGroup2); 
       } 
      } 
     } 
    } 

    return removed; 
} 

protected boolean isVisible() { 
    return true; // override 
} 
1

मैं V7 preference उपयोग करने की अनुशंसा, यह setVisible() विधि है। लेकिन मैंने अभी तक कोशिश नहीं की है।

0

मुझे कुछ इसी तरह की आवश्यकता थी: दो अतिरिक्त वरीयताओं को छिपाने या दिखाने के लिए स्विच को टॉगल करना। Android-Support-Preference-V7-Fix से नमूना ऐप देखें जो कुछ नए वरीयता प्रकार लाता है और आधिकारिक पुस्तकालय से कुछ मुद्दों को हल करता है। प्राथमिकता श्रेणी दिखाने या छिपाने के लिए चेकबॉक्स को टॉगल करने के लिए वहां एक उदाहरण है।

findPreference("pref_show_extra_stuff").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      findPreference("pref_extra_stuff_01").setVisible((Boolean) newValue); 
      findPreference("pref_extra_stuff_02").setVisible((Boolean) newValue); 
      return true; 
     } 
    }); 

pref_extra_stuff_01 और pref_extra_stuff_02 दो वरीयताओं कि जब pref_show_extra_stuff चालू किए जाने पर छिपे हुए हैं कर रहे हैं:

टुकड़ा है कि PreferenceFragmentCompatDividers फैली में, आप की तरह कुछ इस्तेमाल कर सकते हैं।

संबंधित मुद्दे