2011-04-07 10 views
17

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

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

इसके अलावा, यह ऐप की कॉन्फ़िगरेशन के लिए विशिष्ट है, और किसी साझा सिस्टम फ़ाइल या उस तरह से कुछ भी संग्रहीत नहीं किया जाना चाहिए।

उत्तर

61

उपयोग

Resources.getSystem().getString(android.R.string.someuniversalstuff) 

आप अपने आवेदन में बिल्कुल हर जगह इसका इस्तेमाल कर सकते हैं और भी स्थिर स्थिरांक घोषणा में! लेकिन केवल सिस्टम संसाधनों के लिए।

स्थानीय संसाधनों के लिए that solution का उपयोग करें।

+21

** लेकिन केवल सिस्टम संसाधनों के लिए। ** – Youngjae

+0

@Youngjae हाँ। और स्थानीय लोगों के लिए संदर्भ का पालन करें। – Gangnus

+0

मुझे एक अपवाद मिला: android.content.res.Resources $ NotFoundException: स्ट्रिंग संसाधन आईडी – vinidog

1

दुर्भाग्य से मुझे नहीं लगता कि इसके आसपास एक वास्तविक तरीका है। मैं इस तरह से कुछ बाहर रखता हूं, और गतिविधि संदर्भ के बजाय getAplicationContext() में भी पास करता हूं।

public static AppController getAppController(Context context){ 
    if(self == null) { 
     //Create instance 
     self = new AppController(); 
    } 

    return self; 
} 

और फिर:

appController = AppController.getAppController(getApplicationContext()); 
+0

ओह ठीक है, मुझे डर है कि इस सवाल का जवाब जा रहा था था। यह संदर्भों से केवल ऐप संसाधनों तक पहुंचने में सक्षम होने के लिए बहुत खराब डिज़ाइन की तरह लगता है। मुझे यकीन है कि इसके लिए कारण हैं ... लेकिन यह कष्टप्रद नहीं है। इसकी पुष्टि करने के लिए धन्यवाद =) – mnemy

+0

मेरी टीम और मैं हर समय शिकायत करता हूं। यह uncoupled मॉड्यूलर कोड लिखना मुश्किल बनाता है। – sgarman

1

मैं कर रहा सिफारिश करेंगे निम्नलिखित: बल्कि संदर्भ गुजर से हर जगह अपनी गतिविधि वर्ग एक सार्वजनिक समारोह इस संदर्भ रिटर्न के साथ एक सिंगलटन वर्ग बनाने:

private static ActivityMain instance; 

प्रारंभ OnCreate() super.onCreate से पहले (अंदर):

instance = this; 

फिर अपनी गतिविधि करने के लिए इन सार्वजनिक कार्यों को जोड़ने:

/** Get singleton instance of activity **/ 
public static ActivityMain getInstance() { 
    return instance; 
} 

/** Returns context of this activity **/ 
public static Context getContext(){ 
    return instance.getApplicationContext(); 
} 

अब आप किसी भी वर्ग में कहीं भी निम्न का उपयोग कर सकते हैं:

Context context = AntiMorphActivity.getContext(); 
String packageName = context.getPackageName(); 
int id = context.getResources().getIdentifier("web_page", "raw", packageName); 
+0

बेहद भयानक समाधान। आप इस तरह से गतिविधि को लीक कर रहे हैं। –

+2

नहीं, वह आवेदन संदर्भ का उपयोग कर रहा है, इसलिए गतिविधि लीक नहीं है। – Davor

9

आप मुख्य आवेदन वर्ग का विस्तार करने और वहाँ संसाधनों का उपयोग करने सार्वभौमिक सहायकों प्रदान कर सकता है। यह संदर्भ की आवश्यकता को राहत देता है क्योंकि एप्लिकेशन कॉलर के बजाय संदर्भ प्रदान करेगा। एप्लिकेशन क्लास सिंगलटन शैली है और हमेशा आपके आवेदन के किसी भी भाग (सेवाओं सहित) चलने पर उपलब्ध होना चाहिए।

public class MyApplication extends Application { 
protected static MyApplication instance; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    instance = this; 
} 

public static Resources getResources() { 
    return instance.getResources(); 
} 
} 

यह प्रदान करता है आप का उपयोग करने की:

MyApplication.getResources().... 

इस तक पहुंच हासिल करने के लिए अपने मेनिफेस्ट में अपने कस्टम अनुप्रयोग घोषित करने के लिए सुनिश्चित करें।अपने कस्टम आवेदन मानते हुए अपने आवेदन की नाम स्थान की जड़ में है:

<application 
android:name=".MyApplication" 
... > 
+0

क्या इसका उपयोग करने के लिए कोई संभावित कमी है? –

0

नीचे इस सवाल का जवाब stackoverflow दिखाता है कि कैसे POJO उपयोग करने के लिए एक संसाधन के लिए एक धारा प्राप्त करने के लिए, यदि आप अपने रास्ते की आपूर्ति। यह उन मामलों में उपयोगी हो सकता है जिन्हें आपको कई में से एक से विशिष्ट संसाधन चुनने की आवश्यकता है।

Is it possible to read a raw text file without Context reference in an Android library project

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