Android प्राथमिकताएं: उपयोगकर्ता द्वारा वरीयताओं-स्क्रीन का उपयोग नहीं किए जाने पर डिफ़ॉल्ट मानों को कैसे लोड किया जाए?


119

उपयोगकर्ता को कुछ मान सेट करने के लिए मैं एक प्राथमिकता का उपयोग कर रहा हूं। मैं इसे परिभाषित प्राथमिकताओं के साथ xml फ़ाइल खिला रहा हूं।

मैंने उनके लिए सब तय कर android:defaultValue=""दिया है।

जब मैं अपना आवेदन शुरू करता हूं, मुझे वरीयताओं की आवश्यकता होती है, या यदि वे अभी तक मैन्युअल रूप से सेट नहीं होते हैं, तो मुझे डिफ़ॉल्ट मान चाहिए:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false); 

हालांकि, जब android:defaultValue="true"मैं अभी भी मिलता हूं false। तो, ऐसा लगता है कि XML में तयशुदा DefaultValues ​​का उपयोग कहीं भी नहीं किया जाता है, लेकिन वरीयताएँ-स्क्रीन को शुरू करते समय।

मैं getBoolean()विधि में डिफ़ॉल्ट मानों को हार्डकोड नहीं करना चाहता । तो, क्या कोई तरीका है जो केवल 1 स्थान पर इन्हें परिभाषित करने के साथ डिफ़ॉल्ट-मान प्राप्त करता है?

जवाबों:


169

यह प्रश्न मेरे लिए समान है:

इनिशियलाइज़-वरीयताओं-से-एक्सएमएल में मुख्य गतिविधि

बस इस कोड को onCreateविधि में उपयोग करें :

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

यह XML से आपकी प्राथमिकताओं को लोड करेगा, और अंतिम पैरामीटर ( readAgain) गारंटी देगा कि उपयोगकर्ता प्राथमिकताएं अधिलेखित नहीं की जाएंगी। इसका अर्थ है कि यह readAgainतर्क निर्धारित करने का falseमतलब है कि यह केवल डिफ़ॉल्ट मान सेट करेगा यदि इस पद्धति को अतीत में कभी नहीं बुलाया गया है, तो आपको हर बार जब आपकी गतिविधि बनाई जाती है, तो उपयोगकर्ता की सेटिंग्स को ओवरराइड करने के बारे में चिंता करने की आवश्यकता नहीं है।

आगे की जाँच के लिए Android API में वरीयता प्रबंधक.सेटडाल्ट वॉल्यूल्स पर एक नज़र डालें ।


क्या हम इसे हमारे द्वारा बनाए गए किसी भी अन्य SharedPrefrence संस्करण पर उपयोग कर सकते हैं?
अमोल गुप्ता

8
इसके अलावा, यदि आपका ऐप एकाधिक प्रवेश बिंदुओं है, यह में जगह onCreate()की Application
एसडी

2
यह काम नहीं करता है यदि एक बूलियन का उपयोग करते हुए और "झूठे" के लिए डिफ़ॉल्ट के रूप में तब डिफ़ॉल्ट प्रविष्टि एंड्रॉइड 2.x में नहीं बनाई जाएगी। ".GetBoolean (कुंजी, सत्य)" के लिए एक कॉल हमेशा सही वापस आएगा। Android 4.x के लिए यह काम करता है।
गुन्नार बर्नस्टीन

10
readAgainसत्य को सेट करने से उपयोगकर्ता की प्राथमिकताएँ अधिलेखित होने से कोई लेना-देना नहीं है। Javadoc से: नोट: यह वरीयताओं को उनके डिफ़ॉल्ट मानों पर वापस रीसेट नहीं करेगा।
devconsole

1
जिन लोगों को इस समाधान की समस्या है (यह काम नहीं करता है या आंशिक रूप से या हमेशा काम नहीं करता है) स्टीव वॉरिंग का जवाब नीचे देखें ( stackoverflow.com/a/25602205/4410376 )। सबसे अधिक संभावना है कि आपके पास कई साझा-प्रीफ़ फ़ाइलें हैं, यानी एंड्रॉइड आपके कॉन्फ़िगरेशन या गन्दे कोड के आधार पर कई साझा-प्रीफ़्स फ़ाइलें बना रहा है।
हैक

27

ध्यान रहे कि यदि आप उपयोग कर रहे हैं
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

वरीयताओं को निर्धारित करने के लिए आपको वरीयताओं को प्राप्त करना है !
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)

उदाहरण के लिए:
PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

मुझे उम्मीद है कि यह किसी की मदद कर सकता है।


13

पिक्सेल के स्वीकृत उत्तर में:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

यह कहा गया falseहै कि चूक को अधिलेखित नहीं किया जाएगा। यह ऐसा नहीं है, यह पार्सिंग को रोकने के लिए सिर्फ एक दक्षता ध्वज है यदि आपके आवेदन में एक से अधिक प्रवेश बिंदु हैं। दुर्भाग्य से परीक्षण प्राथमिकता फ़ाइल के अनुसार नहीं किया गया है, इसलिए यदि आपके पास एक से अधिक वरीयता फ़ाइल है, तो आपको कोड trueसभी पर पहले होना चाहिए ।

यदि आप दक्षता के बारे में चिंतित हैं, तो आप कुछ इस तरह से कोड कर सकते हैं।

final static private int SPL = 1;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (sp.getInt("spl", 0) != SPL)
{
    PreferenceManager.setDefaultValues(this, R.xml.prefs1, true);
    PreferenceManager.setDefaultValues(this, R.xml.prefs2, true);
    sp.edit().putInt("spl", SPL).apply();
}

यदि आप कभी भी अधिक साझा प्राथमिकताएँ जोड़ते हैं, तो बस SPL को एक हाइट नंबर पर सेट करें।


2
एक विकल्प के रूप में, आप हमेशा एक प्राथमिक प्राथमिकताएँ बना सकते हैं। xml जिसे आप केवल डिफ़ॉल्ट मान सेट करने के लिए उपयोग करते हैं। उदाहरण के लिए, अगर आपके पास R.xml.prefs_device, R.xml.prefs_test, और R.xml.prefs_admin। आप एक प्रीफ़ फाइल बना सकते हैं जिसमें ऊपर से सभी प्रीफ़्स शामिल हैं R.xml.prefs_for_loading_default_values:। फिर उस का उपयोग करें PreferenceManager.setDefaultValues(this, R.xml.prefs_for_loading_default_values, false);
Chantell Osejo

दक्षता के बारे में: यदि आप इसे onCreate()उप-वर्ग Application(मेनिफ़ेस्ट में पंजीकृत) के रूप में कहते हैं, तो इसे केवल एक बार आवेदन के शुरू होने के बाद ही कहा जाएगा। प्रदर्शन के लिए यह अधिक प्रासंगिक होगा (यदि बिल्कुल भी) प्रत्येक बार ऐप शुरू होने के बजाय पार्सिंग न करें (इसके बजाय यह केवल पहली शुरुआत है) और यही वह falseहै। इसलिए यह अधिक सवाल है कि क्या आपको प्रत्येक प्रारंभ पर एक चेक की आवश्यकता है (उदाहरण के लिए जब नई प्राथमिकताएं जोड़ी जा सकती हैं) या यह पहली शुरुआत (या वरीयताएँ रीसेट) पर किए जाने के लिए पर्याप्त है या नहीं।
user905686

2

उदाहरण के लिए DialogPreferenceमैं यह कर रहा हूं:

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    super.onSetInitialValue(restore, defaultValue);

    if (restore) {
        mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
    } else {
        mValue = mDefault;
    }
}

mDefault हो सकता है:

  • mContext.getResources ()। getString (attrs.getAttributeResourceValue (androidns, "defaultValue", 100));
  • कुछ ऐसा है जिसे आपने R में अनुक्रमित किया है।

ठीक है, मैं यहां थोड़ा खो गया हूं कि आप क्या हासिल करने की कोशिश कर रहे हैं। मैं DialogPreference को कॉल नहीं करना चाहता, जब उपयोगकर्ता वरीयताएँ नहीं लेता तो मुझे डिफ़ॉल्ट मान की आवश्यकता होती है।
पीटरडक

अपने Prefs.xml में डिफ़ॉल्ट प्राथमिकता का उपयोग करने के बजाय आप अपनी कक्षाएं बना सकते हैं। उदाहरण के लिए, आप एक नया DialogPreference DialogPreference से बना सकते हैं और onSetInitialValue को ओवरराइड कर सकते हैं।
मैकरस

0

यह भी सुनिश्चित करें कि आपने पहले कभी भी SharedPreferences का उपयोग नहीं किया है। यह सुनिश्चित करने के लिए कि वे बदले नहीं गए हैं (जिसका अर्थ है setDefaultValues ​​(यह, xml, false) का कोई प्रभाव नहीं है) अपने ऐप को अनइंस्टॉल करें और इसे फिर से अपलोड करें यह सुनिश्चित करने के लिए कि कोई मान स्पर्श नहीं किया गया है। इससे मुझे मदद मिली।

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