2011-11-23 8 views
51

मेरे आवेदन में मेरे पास कई कक्षाएं और गतिविधियां हैं। Droid एक वर्ग है जिसमें संदर्भ नहीं है। Mygame एक वर्ग है जो SurfaceView को बढ़ाता है और SurfaceHolder लागू करता है। कॉलबैक। मैं mygame क्लास में Droid का ऑब्जेक्ट बना रहा हूं और इसके लिए पृष्ठभूमि छवि और स्थिति सेट कर रहा हूं। इसके लिए मैंने जो कोड लिखा है वह नीचे दिया गया है।किसी वर्ग से getResources() को कॉल करने के लिए कैसे कोई संदर्भ नहीं है?

block1 = new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.birdpic), 100, 10); 

Droid क्लास का निर्माता नीचे दिया गया है।

public Droid(Bitmap bitmap, int x, int y) { 

    this.bitmap = bitmap; 
    this.x = x; 
    this.y = y; 
} 

एक विशेष परिदृश्य मैं Droid वर्ग itself.Here मैं नीचे issue.Given का सामना करना पड़ रहा से पृष्ठभूमि छवि और Droid वस्तु की स्थिति सेट करने के लिए में यह करने के लिए कोड का टुकड़ा है।

if(checkflag) 
{ 
    myObj.centerblock=new Droid(BitmapFactory.decodeResource(getResources(), R.drawable.blast), myObj.xpos, myObj.ypos); 
} 

समस्या यह है कि Droid क्लास का कोई संदर्भ नहीं है। तो मैं यहां getResources() का उपयोग नहीं कर सकता। मैंने नीचे दिए गए कोड को आजमाया है लेकिन यह दुर्घटनाग्रस्त हो गया है।

if(checkflag) 
{ 
    myObj.centerblock=new Droid(BitmapFactory.decodeResource(myObj.getResources(), R.drawable.blast), myObj.xpos, myObj.ypos); 
} 

क्या कोई मेरी मदद कर सकता है। मैं बस पृष्ठभूमि छवि को सेट करना चाहता हूं और इसे Droid ऑब्जेक्ट के लिए Droid क्लास से ही स्थिति में रखना चाहता हूं।

+1

[getResources() गैर गतिविधि कक्षा में उपयोग करना] के संभावित डुप्लिकेट (http://stackoverflow.com/ प्रश्न/7666589/उपयोग-प्राप्त-गैर-गतिविधि-वर्ग) –

उत्तर

46

एक संदर्भ प्रणाली के लिए एक संभाल है; यह संसाधनों को हल करने, डेटाबेस और वरीयताओं तक पहुंच प्राप्त करने जैसी सेवाओं को प्रदान करता है, और इसी तरह। यह एक "इंटरफ़ेस" है जो एप्लिकेशन विशिष्ट संसाधनों और कक्षा और एप्लिकेशन वातावरण के बारे में जानकारी तक पहुंच की अनुमति देता है। आपकी गतिविधियां और सेवाएं पर्यावरण की जानकारी तक पहुंचने के लिए उन सभी तरीकों का वारिस करने के लिए संदर्भ का विस्तार करती हैं जिसमें एप्लिकेशन चल रहा है।

इसका मतलब है कि यदि आप संसाधनों के बारे में कुछ विशिष्ट जानकारी प्राप्त करना/संशोधित करना चाहते हैं तो आपको विशिष्ट वर्ग में संदर्भ पारित करना होगा। आप की तरह

public classname(Context context, String s1) 
{ 
... 
} 
+0

क्या Droid क्लास के लिए संदर्भ सेट करना संभव है ... यह गतिविधि या किसी अन्य वर्ग को विस्तारित नहीं कर रहा है –

+2

इसे किसी गतिविधि को विस्तारित करने की आवश्यकता नहीं है। कुछ कक्षाओं से इस कक्षा को प्रारंभ करते समय आप इस कक्षा में संदर्भ पारित कर सकते हैं। – Ali

28

इसका सामान्य समाधान कक्षा के संदर्भ को उदाहरण के रूप में पारित करना है, या इसे पहले बनाया गया है लेकिन इससे पहले कि आपको संदर्भ का उपयोग करने की आवश्यकता हो।

एक अन्य समाधान अनुप्रयोग संदर्भ तक पहुंचने के लिए एक स्थिर विधि के साथ एक एप्लिकेशन ऑब्जेक्ट बनाना है, हालांकि जोड़े Droid ऑब्जेक्ट को कोड में काफी कसकर जोड़ता है।

public class App extends android.app.Application 
{ 
    private static App mApp = null; 
    /* (non-Javadoc) 
    * @see android.app.Application#onCreate() 
    */ 
    @Override 
    public void onCreate() 
    { 
     super.onCreate(); 
     mApp = this; 
    } 
    public static Context context() 
    { 
     return mApp.getApplicationContext(); 
    } 
} 

और अनुप्रयोग कॉल:

संपादित करें, उदाहरण

या तो संशोधित Droid वर्ग इस

public Droid(Context context,int x, int y) { 
    this.bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.birdpic); 
    this.x = x; 
    this.y = y; 
    } 

की तरह कुछ हो या फिर इस तरह एक आवेदन कुछ बनाना गयी। संदर्भ() जहां भी आपको एक संदर्भ की आवश्यकता है - ध्यान दें कि सभी फ़ंक्शन किसी एप्लिकेशन संदर्भ पर उपलब्ध नहीं हैं, कुछ केवल avai हैं एक गतिविधि संदर्भ पर योग्य है लेकिन यह निश्चित रूप से getResources() के लिए आपकी आवश्यकता के साथ करेगा।

कृपया ध्यान दें कि आप एंड्रॉयड जोड़ने की आवश्यकता होगी: अपने प्रकट, कुछ इस तरह में अपने आवेदन परिभाषा के नाम:

<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:name=".App" > 
+0

Usind एंड्रॉइड बिटमैप एंड्रॉइड कोड को तंग युग्मन प्रदान करता है। मैं आम तौर पर इंटरफ़ेस से संबंधित कोड और एप्लिकेशंस विशिष्ट सामग्री को अलग करने का प्रयास करता हूं (मैं सफल नहीं हूं) –

+0

@zeetoobiker ... क्या आप कृपया इन चीजों को समझा सकते हैं? मैं आपको नहीं लेता .. मैं एंड्रॉइड से परिचित नहीं हूं। –

+0

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

22

उदाहरण निर्माता में संदर्भ पारित कर सकते हैं:

Resources.getSystem().getString(R.string.app_name) 
+15

यह केवल सिस्टम संसाधनों का उपयोग करता है, न कि ऐप संसाधन - जो 99% मामलों में – Adam

+0

हाँ काम नहीं करेगा ... यह मेरे लिए भी काम नहीं करता है। मुझे तारों के लिए एक एनम अनुवाद के लिए ऐप संसाधनों की आवश्यकता थी और वे नहीं मिला। अंत में संसाधन बनाने के लिए एक ऐसा फ़ंक्शन बनाने के लिए समाप्त हुआ जिसने इस पोस्ट में कहीं और बात की थी। –

1

यह हमेशा मेरे लिए काम करता:

import android.app.Activity; 
import android.content.Context; 

public class yourClass { 

Context ctx; 

public yourClass (Handler handler, Context context) { 
super(handler); 
    ctx = context; 
} 

//Use context (ctx) in your code like this: 
block1 = new Droid(BitmapFactory.decodeResource(ctx.getResources(), R.drawable.birdpic), 100, 10); 
//OR 
builder.setLargeIcon(BitmapFactory.decodeResource(ctx.getResources(), R.drawable.birdpic)); 
//OR 
final Intent intent = new Intent(ctx, MainActivity.class); 
//OR 
NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); 
//ETC... 

} 

इस सवाल लेकिन उदाहरण से संबंधित नहीं का उपयोग कर app_name स्ट्रिंग हो रही है इस तरह पहुँच सिस्टम संसाधन/गतिविधि के लिए एक टुकड़ा:

public boolean onQueryTextChange(String newText) { 
Activity activity = getActivity(); 
Context context = activity.getApplicationContext(); 
returnSomething(newText); 
return false; 
} 

View customerInfo = getActivity().getLayoutInflater().inflate(R.layout.main_layout_items, itemsLayout, false); 
itemsLayout.addView(customerInfo); 
0

यह आसानी से अगर यू एक वर्ग है कि आवेदन से फैली की घोषणा की थी किया जा सकता है

इस वर्ग के एक सिंगलटन तरह होगा, इसलिए जब यू एक संदर्भ की जरूरत है यू यह सिर्फ इस तरह प्राप्त कर सकते हैं:

मैं लगता है कि यह बेहतर जवाब और क्लीनर

यहाँ उपयोगिताएँ पैकेज से मेरी कोड है:

public static String getAppNAme(){ 
    return MyOwnApplication.getInstance().getString(R.string.app_name); 
} 
संबंधित मुद्दे