स्क्रीन से किसी वरीयता को निकालें / छिपाएँ


134

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

जवाबों:


171

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

myPreferenceScreen.removePreference(myPreference);

महान! धन्यवाद! काम करता है और सही समझ में आता है
बोसोन

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

2
दुर्भाग्य से, यह स्थायी रूप से वरीयता को हटा देता है। क्या सिर्फ इसे छिपाना संभव है?
दिमित्री

यह मेरे लिए भी काम नहीं करता है। वरीयता बनी हुई है!
दिमित्री

@ डमित्री आप इसे सिर्फ ग्रे कर सकते हैंsetEnabled()
जेकड

212

यदि आपका 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);

5
निष्पक्ष होने के लिए, उपरोक्त उत्तर कहता है कि आपको माता-पिता की आवश्यकता है PreferenceCategory
मैट

49

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

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

4
यह अभ्यस्त कार्य यदि वरीयता श्रेणी के अंदर स्थित है। आप findPreferenceश्रेणी के लिए है, और श्रेणी से वरीयता को दूर
MB34

1
@ बीजिंग: उस चेतावनी का उल्लेख करने के लिए धन्यवाद!
1 ''

9

यदि आप ऐसा कुछ चाहते हैं, जो स्विचप्रेफेरेंस पर उदाहरण के लिए प्रीफ़्स को गतिशील रूप से बदल देगा, तो मैंने अपने सभी उप विकल्पों को दो श्रेणी के कंटेनरों में डालने का सबसे अच्छा तरीका पाया है। प्रारंभ में आपके पास सब कुछ दिखाया जाएगा, फिर आप बस उन बिट्स को हटा दें जिन्हें आप नहीं चाहते हैं। होशियार बिट, क्या आप बस कुछ ट्रिगर करते हैं जब कुछ बदलता है और फिर आपको मैन्युअल रूप से कुछ भी बनाने या चीजों को सही क्रम में वापस लाने के बारे में चिंता करने की ज़रूरत नहीं है।

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();
    }
}

केवल नकारात्मक पक्ष जो मैं इस के साथ देख सकता हूं, वहाँ एक फ्लैश है क्योंकि स्क्रीन को खरोंच से फिर से बनाया गया है।


मामला काम नहीं करता है, कम से कम 22 में नहीं। लेकिन इसे वरीयता में बदलना (भले ही यह वरीयताओं का समूह हो) काम नहीं करता है।
रोब

रोब, मैंने अभी एक API22 AVD में उपरोक्त कोड का परीक्षण किया है और यह ठीक काम कर रहा है। सुनिश्चित करें कि आपकी वरीयता XML सामग्री आपके कोड से मेल खाती है। ऊपर दिए गए उदाहरण के लिए स्विचप्रेफेरेंस कहीं भी हो सकता है, लेकिन आपको वरीयतास्क्रीन की प्रत्यक्ष संतान होने के लिए वरीयता श्रेणी की आवश्यकता है।
जेम्स

मुझे सिर्फ एक वर्ग के रूप में श्रेणी मिली, कोई कास्ट नहीं, और इसे हटा दिया। काम किया।
रोब

8

आपकी 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

8

यदि आप पसंद हैफ्रीग्रेमेंट कॉम का उपयोग कर रहे हैं तो आप xml में विज़िबिलिटी सेट कर सकते हैं।

आपकी xml में वरीयताएँ स्वतः ही AppCompat संस्करणों में परिवर्तित हो जाएंगी। तब आप अपने xml में ' app :PreferenceV अदृश्य ' विशेषता का उपयोग कर सकते हैं

preferences.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <CheckBoxPreference
        android:defaultValue="false"
        android:key="show.navigation"
        android:title="Show navigation"
        app:isPreferenceVisible="false" />

...

यह विशेषता https://developer.android.com/guide/topics/ui/settings/compords-and-attributes पर प्रलेखित है।

जोड़ना https://developer.android.com/guide/topics/ui/settings/#inflate_the_hierarchyPreferenceFragmentCompat पर प्रलेखित है

उदाहरण:

public class MySettingsActivity extends AppCompatActivity {

    public static class MySettingsFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.preferences, rootKey);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
} 

5

मैं v7 वरीयता का उपयोग करने की सलाह देता हूं, इसकी setVisible()विधि है। लेकिन मैंने अभी तक इसकी कोशिश नहीं की है। तदनुसार आपको PreferenceFragmentइसके बजाय उपयोग करना होगा PreferenceActivity


स्वीकृत उत्तर V7 के लिए काम नहीं करेगा।
सेटविज़ुअल

3

XML फ़ाइल में आप शीर्षक और सारांश टैग खाली छोड़ कर एक छिपी वरीयता बना सकते हैं।

<EditTextPreference
    android:defaultValue="toddlerCam"
    android:key="save_photo_dir"
/>

यह मेरे लिए एकदम सही जवाब है। मैं इसके लिए देख रहा हूं। धन्यवाद!
夏 劇場

2

यहां यह करने का एक सामान्य तरीका है जो वरीयता के अधीन है 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;
}


0

आप इसे 2 तरीकों से कर सकते हैं:

1. यदि आप समर्थन पुस्तकालय का उपयोग करते हैं, तो आप वरीयताओं के पेड़ और उनके माता-पिता का नक्शा बना सकते हैं, और फिर उसके माता-पिता का उपयोग करके वरीयता को हटा सकते हैं। इस तरह का नक्शा बनाने के लिए एक समारोह है:

public static Map<Preference, PreferenceGroup> buildPreferenceParentTree(@NonNull final PreferenceScreen preferenceScreen) {
    final Map<Preference, PreferenceGroup> result = new HashMap<>();
    final Stack<PreferenceGroup> curParents = new Stack<>();
    curParents.add(preferenceScreen);
    while (!curParents.isEmpty()) {
        final PreferenceGroup parent = curParents.pop();
        final int childCount = parent.getPreferenceCount();
        for (int i = 0; i < childCount; ++i) {
            final Preference child = parent.getPreference(i);
            result.put(child, parent);
            if (child instanceof PreferenceGroup)
                curParents.push((PreferenceGroup) child);
        }
    }
    return result;
}
  1. यदि आप नए एंड्रॉइड-एक्स वरीयता एपीआई का उपयोग करते हैं, तो आप बस दृश्यता सेट कर सकते हैं, उस पर सेटविवि फ़ंक्शन का उपयोग करके ।

डॉक्स के अनुसार और चाय का जवाब setVisible() सपोर्ट लाइब्रेरी के संस्करण 24.1.0 के बाद से उपलब्ध है।
JJD

आपने जो लिखा है उस पर गौर किया है? मैंने विशेष रूप से लिखा है कि अब यह संभव है ... इसके अलावा, पहला समाधान निकालने में मदद करता है, जो छिपाने से थोड़ा अलग है ..
एंड्रॉइड डेवलपर

हां, मैंने आपका जवाब पढ़ा। मैं आपके 2 अंक की बात कर रहा था। यह पढ़ता है कि क्या setVisibile()विधि एंड्रॉइड-एक्स से उपलब्ध है जिसे मैंने स्पष्ट करने की कोशिश की थी। कृपया कोई अपराध न करें।
JJD

एंड्रॉइड-एक्स सभी समर्थन पुस्तकालयों को बदलने के लिए एक है। जैसा कि हम उन्हें जानते हैं, समर्थन पुस्तकालय के नए संस्करण नहीं होंगे।
Android डेवलपर

सही बात। मुझे इसकी जानकारी है । फिर भी, जो लोग पूर्व संस्करणों के साथ फंस गए हैं वे विधि का उपयोग कर सकते हैं।
JJD

0

यदि आप मूल्यांकन करना चाहते हैं, और उस मास्क के आधार पर, एक विकल्प हो सकता है

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

यह सब भीतर होना चाहिए

public static class PrefsFragment extends PreferenceFragment {

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

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

बेशक मेरा इरादा उन लोगों को भी प्रदान करना था जो अंग्रेजी नहीं बोलते हैं
गुस्तावो एडुआर्डो बेल्डुमा

3
@GustavoEduardoBelduma तो आपको यह मेटा
सिंह

0

यदि आप वह कर रहे हैं जो मुझे लगता है कि आप करने की कोशिश कर रहे हैं (क्योंकि मैं इसे करने की कोशिश कर रहा हूं) तो वरीयता को सक्षम / अक्षम करना बेहतर हो सकता है। क्योंकि इसे हटाने से इसे वरीयता स्क्रीन से बाहर ले जाया जाता है और आप इसे वापस नहीं जोड़ सकते हैं जहां आप इसे चाहते हैं यदि आपने स्क्रीन को प्रोग्रामेटिक रूप से बनाया है।

pref.setEnabled (गलत); pref.setEnabled (सही);

हालांकि यह पदावनत हो सकता है। यह उपयोग के मामले के लिए काम करता है जो मैं अभी से गुजर रहा हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.