एंड्रॉइड में एक प्राथमिकता से मुझे SharedPreferences कैसे मिलता है?


373

मैं अपने आवेदन के लिए कुछ सेटिंग्स दिखाने के लिए एक प्राथमिकता का उपयोग कर रहा हूं। मैं एक xml फ़ाइल के माध्यम से सेटिंग्स को फुला रहा हूं ताकि मेरी onCreate (और पूरी कक्षा के तरीके) इस तरह दिखें:

public class FooActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.preference);
    }
}

की जावाडोक PreferenceActivity PreferenceFragment कहा गया है कि

उपयोगकर्ता द्वारा उनके साथ बातचीत करने पर ये प्राथमिकताएँ स्वतः साझा किए गए सहेजे जाएँगे। इस गतिविधि में वरीयता पदानुक्रम का उपयोग करने वाले SharedPreferences का एक उदाहरण प्राप्त करने के लिए, getDefaultSedenPreferences (android.content.Context) को इस गतिविधि के समान पैकेज के संदर्भ में कॉल करें।

लेकिन मुझे दूसरी गतिविधि में शेयर्डप्रेशन का नाम कैसे मिलेगा? मैं केवल फोन कर सकता हूं

getSharedPreferences(name, mode)

अन्य गतिविधि में, लेकिन मुझे SharPPreference के नाम की आवश्यकता है जो वरीयता-विधि द्वारा उपयोग किया गया था। नाम क्या है या मैं इसे कैसे प्राप्त कर सकता हूं?

जवाबों:


721
import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring", true);

अपडेट करें

साझा वरीयताएँ के अनुसार | साईं गीता एमएन द्वारा एंड्रॉइड डेवलपर ट्यूटोरियल (भाग 13) ,

कई एप्लिकेशन विशिष्ट एप्लिकेशन या किसी गतिविधि की सेटिंग्स पर उपयोगकर्ता की प्राथमिकताओं को पकड़ने का एक तरीका प्रदान कर सकते हैं। इसका समर्थन करने के लिए, Android एपीआई का एक सरल सेट प्रदान करता है।

प्राथमिकताएं आमतौर पर नाम जोड़े हैं। उन्हें एक एप्लिकेशन में विभिन्न गतिविधियों में "साझा प्राथमिकताएं" के रूप में संग्रहीत किया जा सकता है (ध्यान दें कि वर्तमान में इसे प्रक्रियाओं में साझा नहीं किया जा सकता है)। या यह कुछ ऐसा हो सकता है जिसे किसी गतिविधि के लिए विशिष्ट रूप से संग्रहीत किया जाना चाहिए।

  1. साझा प्राथमिकताएँ: साझा प्राथमिकताओं का उपयोग अनुप्रयोगों के सभी घटकों (गतिविधियों, सेवाओं आदि) द्वारा किया जा सकता है।

  2. गतिविधि ने प्राथमिकताएँ संभाला: इन प्राथमिकताओं का उपयोग केवल विशेष गतिविधि के भीतर किया जा सकता है और इसका उपयोग अनुप्रयोग के अन्य घटकों द्वारा नहीं किया जा सकता है।

साझा प्राथमिकताएँ:

साझा वरीयताओं को कक्षा की getSharedPreferencesविधि की सहायता से प्रबंधित किया जाता है Context। प्राथमिकताओं को एक डिफ़ॉल्ट फ़ाइल (1) में संग्रहीत किया जाता है या आप वरीयताओं को संदर्भित करने के लिए उपयोग किए जाने वाले फ़ाइल नाम (2) को निर्दिष्ट कर सकते हैं ।

(1) अनुशंसित तरीका फ़ाइल नाम निर्दिष्ट किए बिना, डिफ़ॉल्ट मोड द्वारा उपयोग करना है

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(२) यहाँ फ़ाइल नाम निर्दिष्ट करने पर आपको उदाहरण मिलता है

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

MODE_PRIVATEवरीयताओं के लिए ऑपरेटिंग मोड है। यह डिफ़ॉल्ट मोड है और इसका मतलब है कि बनाई गई फ़ाइल केवल कॉलिंग एप्लिकेशन द्वारा एक्सेस की जाएगी। अन्य समर्थित दो मोड हैं MODE_WORLD_READABLEऔर MODE_WORLD_WRITEABLE। में MODE_WORLD_READABLEअन्य अनुप्रयोग बनाई गई फ़ाइल को पढ़ सकता है, लेकिन यह नहीं बदल सकते। MODE_WORLD_WRITEABLEअन्य अनुप्रयोगों के मामले में भी बनाई गई फ़ाइल के लिए लिखने की अनुमति है।

अंत में, जब आपके पास वरीयताएँ होती हैं, तो यहां बताया गया है कि आप वरीयताओं से संग्रहीत मूल्यों को कैसे प्राप्त कर सकते हैं:

int storedPreference = preferences.getInt("storedInt", 0);

वरीयता फ़ाइल ऑब्जेक्ट में मानों को संग्रहीतSharedPreference.Editor करने के लिए उपयोग किया जाना है। वर्ग Editorमें एक नेस्टेड इंटरफ़ेस है SharedPreference

SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

संपादक भी तरीकों की तरह समर्थन करता है remove()और clear()फ़ाइल से वरीयता मान हटाना।

गतिविधि प्राथमिकताएं:

साझा प्राथमिकताओं का उपयोग अन्य एप्लिकेशन घटकों द्वारा किया जा सकता है। लेकिन अगर आपको अन्य घटकों के साथ वरीयताओं को साझा करने की आवश्यकता नहीं है और गतिविधि को प्राथमिकता देना चाहते हैं तो आप गतिविधि की getPreferences()विधि की मदद से ऐसा कर सकते हैं । getPreferenceविधि का उपयोग करता getSharedPreferences()फ़ाइल प्राथमिकता नाम के लिए गतिविधि वर्ग के नाम के साथ विधि।

वरीयताएँ प्राप्त करने के लिए कोड निम्नलिखित है

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int storedPreference = preferences.getInt("storedInt", 0);

मूल्यों को संग्रहीत करने का कोड भी समान है क्योंकि साझा वरीयताओं के मामले में।

SharedPreferences preferences = getPreference(MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

आप डेटाबेस में गतिविधि स्थिति को संग्रहीत करने जैसी अन्य विधियों का भी उपयोग कर सकते हैं। नोट एंड्रॉइड में एक पैकेज भी होता है जिसे कहा जाता है android.preference। पैकेज अनुप्रयोग वरीयताओं को लागू करने के लिए कक्षाओं को परिभाषित करता है यूआई।

कुछ और उदाहरण देखने के लिए डेवलपर्स साइट पर एंड्रॉइड के डेटा स्टोरेज पोस्ट की जांच करें ।


55
+1: u ने मेरा दिन बचाया .. इंटरनेट पर कोई भी ट्यूटोरियल / उदाहरण इस बारे में नहीं बताता है। सभी वे abt सुविधाओं और अनुकूलन पर बात करते हैं, लेकिन इसे पढ़ने के लिए नहीं।
ankitjaininfo

1
उत्तर का मेरा अपडेट देखें, और फ़ाइल नाम कुछ ऐसा है, package.prefsलेकिन मुझे यकीन नहीं है।
पेन्टियम

1
कोड के लिए धन्यवाद। बस एक छोटी सी बात है जो मुझे भ्रमित कर रही है: साझाकरण एक इंटरफेस है, इसलिए वास्तविक कोड कहां लागू किया गया है जो आपके तरीके को कॉल करता है?
x1886x

1
काश मैंने एक सप्ताह पहले अपना समय बर्बाद करने से पहले यह पढ़ लिया था कि एसई के बारे में कुछ बेवकूफी भरे उत्तर / टिप्पणियां पढ़ रहे हैं, जो सोचते हैं कि वे जानते हैं कि जब वे वास्तव में नहीं होते हैं .. धन्यवाद @ पेंटियम 10, क्या आप किसी भी ब्लॉग के मालिक हैं, फिर से धन्यवाद, वास्तव में इसकी सराहना करते हैं :)
संजीवनी

1
Editor.commit () का उपयोग करने के बजाय, आप editor.apply () का भी उपयोग कर सकते हैं। अंतर यह है कि प्रतिबद्ध () आपके परिवर्तनों को सिंक्रोनाइज़ करता है और लागू करता है कि उन्हें एसिंक्रोनस रूप से लिखते हैं। इससे आपका UI तेज हो जाता है।
हाशिम अख्तर

29

यदि आपके पास पहुंच नहीं है getDefaultSharedPreferenes(), तो आप getSharedPreferences(name, mode)इसके बजाय उपयोग कर सकते हैं , आपको बस सही नाम से गुजरना होगा।

Android यह नाम बनाता है (संभवतः आपके प्रोजेक्ट के पैकेज नाम के आधार पर?)। आप निम्नलिखित कोड को एक में डालकर SettingsActivity onCreate()देख सकते हैं कि क्या preferencesNameहै।

String preferencesName = this.getPreferenceManager().getSharedPreferencesName();

स्ट्रिंग कुछ इस तरह होना चाहिए com.example.projectname_preferences। हार्ड कोड जो आपके प्रोजेक्ट में कहीं है, और इसे पास करें getSharedPreferences()और आपको जाने के लिए अच्छा होना चाहिए।


1
गतिविधि के लिए स्रोत पढ़ता है: सार्वजनिक शेयरडिफ्रेन्स getPreferences (int मोड) {रिटर्न getSaredPreferences (getLocalClassName (), मोड); }
ताताराइज करें

22

इन विधियों की घोषणा पहले करें ।।

public static void putPref(String key, String value, Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getPref(String key, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);
}

जब आप एक प्रीफ़ रखना चाहते हैं तब इसे कॉल करें:

putPref("myKey", "mystring", getApplicationContext());

जब आप एक प्रीफ़ प्राप्त करना चाहते हैं तो इसे कॉल करें:

getPref("myKey", getApplicationContext());

या आप इस ऑब्जेक्ट का उपयोग कर सकते हैं https://github.com/kcochibili/TinyDB--Android-Sared-Preferences-Turbo जो सब कुछ आगे भी सरल करता है

उदाहरण:

TinyDB tinydb = new TinyDB(context);

tinydb.putInt("clickCount", 2);
tinydb.putFloat("xPoint", 3.6f);
tinydb.putLong("userCount", 39832L);

tinydb.putString("userName", "john");
tinydb.putBoolean("isUserMale", true); 

tinydb.putList("MyUsers", mUsersArray);
tinydb.putImagePNG("DropBox/WorkImages", "MeAtlunch.png", lunchBitmap);

संपादक का उपयोग क्यों नहीं करें ।apply (); पृष्ठभूमि में प्रसंस्करण के लिए प्रतिबद्ध होने के बजाय
एवी दर्शन

4

हर जगह चारों ओर संदर्भ पारित करना वास्तव में मुझे परेशान कर रहा है। कोड बहुत क्रियाशील और असहनीय हो जाता है। मैं इसके बजाय हर प्रोजेक्ट में ऐसा करता हूं ...

public class global {
    public static Activity globalContext = null;

और इसे मुख्य गतिविधि बनाने में सेट करें

@Override
public void onCreate(Bundle savedInstanceState) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            global.sdcardPath,
            ""));
    super.onCreate(savedInstanceState);

    //Start 
    //Debug.startMethodTracing("appname.Trace1");

    global.globalContext = this;

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

getText(R.string.yourPrefKeyName).toString()

अब इसे कोड की एक पंक्ति में बहुत सरलता से कॉल करें

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);

4
चाबियाँ भाषा को स्वतंत्र बनाने का क्या फायदा है? वे कभी भी उपयोगकर्ता को नहीं दिखाए जाते हैं, है ना?
गर्ड

1
कृपया, भगवान के प्यार के लिए, एक वैश्विक संदर्भ के रूप में एक गतिविधि का उपयोग कभी न करें। यदि आपको एक वैश्विक संदर्भ का उपयोग करना है तो कृपया कस्टम एप्लिकेशन वर्ग का उपयोग करके ऐसा करें।
थोरबेन

1
@ थोरबन सहमत। या बसgetApplicationContext()
OneCricketeer

3

यदि आपके पास एक चेकबॉक्स है और आप किसी भी जावा फ़ाइल में इसका मूल्य मान लेना चाहते हैं, तो यह सच है / गलत है -

उपयोग--

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`

0

अपडेटेड 2019

आप बस PowerPreferenceपुस्तकालय का उपयोग कर सकते हैं

https://github.com/AliEsaAssadi/Android-Power-Preference

साझा प्राथमिकता उदाहरण प्राप्त करना

डिफ़ॉल्ट उदाहरण प्राप्त करने के लिए आपको बस कॉल करने की आवश्यकता है

PowerPreference.getDefaultFile()

या यदि आप एक विशिष्ट वरीयता फ़ाइल चाहते हैं

PowerPreference.getFileByName(fileName)

लेखन डेटा:

PowerPreference.getDefaultFile().put(key,value)

डेटा प्राप्त करना

PowerPreference.getDefaultFile().getString(key,value)

PowerPreference संदर्भ भाग को कैसे संभालता है? साझा प्रेफ़ को पढ़ने के लिए एक संदर्भ आवश्यक है, नहीं? मैं एंड्रॉइड के लिए नया हूं और समझने की कोशिश कर रहा हूं।
यति

0

स्रोत कोड का पालन करने की कोशिश करें जो मेरे लिए काम करता है

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.