2012-07-19 11 views
11

क्या मेरे पूरे ऐप में साझा किए गए साझाकरण वैश्विक बनाने का कोई तरीका है? अभी मैं अपने कोड में कई जगहों पर इन लाइनों का उपयोग कर रहा हूं ताकि मेरे उपयोगकर्ता सेट कर सकने वाली कई प्राथमिकताओं के लिए सरल ऑन/ऑफ सेटिंग्स स्टोर कर सकें। मैं सिर्फ उन्हें एक बार विश्व स्तर पर यदि संभव हो तो कॉल करना चाहते हैं:क्या मेरे पूरे एंड्रॉइड ऐप में SharedPreferences Global को बनाने का कोई तरीका है?

SharedPreferences settings = getSharedPreferences("prefs", 0); 
SharedPreferences.Editor editor = settings.edit(); 

कैसे सभी वर्गों में बस इन लाइन कॉल करने के लिए भयानक होगा सक्षम होने के लिए पर कोई सुझाव:

editor.putString("examplesetting", "off"); 
editor.commit(); 

और

String checkedSetting = settings.getString("examplesetting", ""); 
+0

मेरा उत्तर देखें। यह –

उत्तर

14

मुझे पता है, मुझे पता है, मैं सूजन हो जाऊंगा, और नरक के एम्बर में डाल दिया जाएगा ....

गायन का प्रयोग करें LETON वर्ग कि SharedPreference सेटिंग्स इर्द-गिर्द घूमती .. कुछ इस तरह:

public class PrefSingleton{ 
    private static PrefSingleton mInstance; 
    private Context mContext; 
    // 
    private SharedPreferences mMyPreferences; 

    private PrefSingleton(){ } 

    public static PrefSingleton getInstance(){ 
     if (mInstance == null) mInstance = new PrefSingleton(); 
     return mInstance; 
    } 

    public void Initialize(Context ctxt){ 
     mContext = ctxt; 
     // 
     mMyPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); 
    } 
} 

और क्या आपके उदाहरण उदाहरण के लिए प्रश्न में प्रतिनिधित्व किया, चारों ओर आवरण कार्यों बनाने के लिए,

PrefSingleton.getInstance().writePreference("exampleSetting", "off");

और कार्यान्वयन कर सकता इस तरह कुछ हो:

// Within Singleton class 

public void writePreference(String key, String value){ 
    Editor e = mMyPreference.edit(); 
    e.putString(key, value); 
    e.commit(); 
} 

अपनी पहली गतिविधि से, सिंगलटन कक्षा को सक्रिय करें, इस तरह से, कुछ इस तरह में:

PrefSingleton.getInstance().Initialize(getApplicationContext()); 

कारण मैं नीचे वोट जोखिम, है, वैश्विक स्थिर वर्गों का उपयोग करना एक बुरा विचार हो सकता है और प्रोग्रामिंग बुनियादी बातों की प्रथा के खिलाफ जाता है कर सकते हैं। लेकिन ने कहा है कि, नाइट-पिक्य तरफ के रूप में, यह सुनिश्चित करेगा कि कक्षा PrefSingleton वर्ग का केवल एकमात्र वस्तु मौजूद हो और यह सुनिश्चित हो सके कि कोड किस गतिविधि पर है।

+2

काम करता है प्राथमिकताएं अनुप्रयोग संदर्भ के साथ काम करती हैं? बहुत सी चीजें नहीं होती हैं, इसलिए इसका उपयोग करना हमेशा मुश्किल होता है। इसके अलावा 'पहली गतिविधि' थोड़ा अपरिभाषित है, क्योंकि ऐप प्रसारण से शुरू किया जा सकता है, लंबित इरादा (विजेट, इत्यादि)। –

+0

@ निकोलेएलेनकोव यकीन है, मैं आपके साथ वहां सहमत हूं, याद रखें, मैंने एक सामान्य उदाहरण दिया है जो मेरे सिर के शीर्ष पर था ... इसे किसी की ज़रूरत के अनुरूप संशोधित किया जा सकता है। :) – t0mm13b

+2

यदि आप एप्लिकेशन का विस्तार करते हैं, तो क्या आप अपने सिंगलटन को अपने उप-वर्ग में प्रारंभ नहीं कर सकते हैं और 'पहली गतिविधि' समस्या से बच सकते हैं? – qix

9

मैं Application का विस्तार करूंगा और SharedPreferences.Editor को गेटर के साथ एक फ़ील्ड के रूप में शामिल करूंगा।

public class APP extends Application { 
    private final SharedPreferences settings = getSharedPreferences("prefs", 0); 
    private final SharedPreferences.Editor editor = settings.edit(); 

    public SharedPreferences.Editor editSharePrefs() { 
     return editor; 
    } 
} 

तो फिर तुम

((APP) getApplication()).editSharePrefs().putString("examplesetting", "off"); 
((APP) getApplication()).editsharePrefs().commit(); 

वैकल्पिक रूप से के साथ किसी भी Activity से पहुंच सकते हैं, आप भी विधि

public static APP getAPP(Context context) { 
     return (APP) context.getApplicationContext(); 
    } 

में फेंक सकता है, यह केवल कॉल आप के लिए बनाने के बदल जाएगा

APP.getAPP(this).editSharePrefs().putString("examplesetting", "off"); 
APP.getAPP(this).editsharePrefs().commit(); 

तो यह वास्तव में एक व्यक्तिगत वरीयता है, जो आपको क्लीनर दिखता है।

+4

यह काम करता है, इसके लिए एक अनुप्रयोग वर्ग का उपयोग कर ओवरकिल है। उल्लेख नहीं है कि आपको इसे हर समय अपनी ठोस कक्षा में डालना होगा। 'संदर्भ' पैरामीटर लेने वाली स्थैतिक विधियों वाला एक सरल सहायक वर्ग (आप गतिविधि में होने पर बस 'यह' पास कर सकते हैं) बहुत बेहतर है। एप्लिकेशन वास्तव में आपको इस मामले में कुछ भी नहीं खरीदता है। –

0

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

public class BaseActivity extends Activity { 

     protected boolean setInHistory; 
     protected SharedPreferences sharedPrefs; 

      @Override 
     protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); 
    setInHistory = true; 
     } 


} 


public class MainActivity extends BaseActivity { 

     public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.activity_main); 

       System.out.println(setInHistory+" <-- setInhistory"); 

      } 
} 

sharedPrefs पहुँच सकते हैं:

2

मैं इस निम्नलिखित करना होगा। यदि यह सेटिंग सेट

In the console you have : true <-- setInhistory 
+0

यह मेरा पसंदीदा समाधान है। – Ish

+0

मुझे लगता है कि यह केवल तभी काम करेगा यदि आपके पास बेसएक्टिविटी बढ़ाने वाली आपकी सभी गतिविधियां हैं। क्या होता है यदि आपके पास Fragments या ViewPagerAdapters हैं जिन्हें आपको चर स्टोर करने की आवश्यकता है? – Simon

+0

@ सिमॉन क्या आप बस अपनी समझ प्राप्त कर सकते हैं? पूर्व, '((मुख्य गतिविधि) getActivity) getSharedPref();'? उस के बारे में कैसा है? –

-1

उपयोग करने के लिए:

public static void SetCheckedSetting(Context context, String value) 
{ 
    SharedPreferences settings = getSharedPreferences("prefs", 0); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putString("examplesetting", value); 
    editor.commit(); 
} 

और इस सेटिंग को प्राप्त करने के लिए:

public static String GetCheckedSetting(Context context) 
{ 
    SharedPreferences settings = getSharedPreferences("prefs", 0); 
    return settings.getString("examplesetting", ""); 
} 

संदर्भ आप बस this कीवर्ड का उपयोग कर सकते पास करने के लिए।

यह महत्वपूर्ण है कि आप स्टोर SharedPreferences एक स्थैतिक चर के रूप में करें। यदि आप ऐसा करते हैं तो यह स्मृति रिसाव का कारण बनता है। देखें: http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html

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