2012-02-04 18 views
8

पर पैरामीटर क्यों नहीं पारित कर सकता हूं मुझे पता है कि मैं एंड्रॉइड में गतिविधि कन्स्ट्रक्टर को पैरामीटर पास नहीं कर सकता, लेकिन मैं समझना चाहता हूं कि क्यों।मैं एंड्रॉइड गतिविधि कन्स्ट्रक्टर

मैं क्या करने की कोशिश की है:

CalorieSelectorActivity csa = new CalorieSelectorActivity(userName); 
       Intent i = new Intent(thisContext, csa.getClass()); 
       startActivity(i); 

मैं इस प्रकार वर्ग को परिभाषित किया है:

public class CalorieSelectorActivity extends Activity { 

public CalorieSelectorActivity(String name) { 
    super(); 

} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.calorieselector); 

} 
} 

और यह पूरी तरह से काम करता है जब मैं निर्माता से पैरामीटर निकालें। मैंने अंततः यह intent.putExtra का उपयोग करके किया, लेकिन यह जानकर बहुत उत्सुकता है कि इसे कन्स्ट्रक्टर को पैरामीटर पास करके क्यों नहीं किया जा सकता है?

LogCat: जब आप कोशिश करते हैं और निर्माता फोन

02-04 06:46:52.257: W/dalvikvm(800): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
02-04 06:46:52.277: E/AndroidRuntime(800): FATAL EXCEPTION: main 
02-04 06:46:52.277: E/AndroidRuntime(800): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.manarbushnaq.calorietracker/com.manarbushnaq.calorietracker.CalorieSelectorActivity}: java.lang.InstantiationException: com.manarbushnaq.calorietracker.CalorieSelectorActivity 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.os.Looper.loop(Looper.java:123) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread.main(ActivityThread.java:4627) 
02-04 06:46:52.277: E/AndroidRuntime(800): at java.lang.reflect.Method.invokeNative(Native Method) 
02-04 06:46:52.277: E/AndroidRuntime(800): at java.lang.reflect.Method.invoke(Method.java:521) 
02-04 06:46:52.277: E/AndroidRuntime(800): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
02-04 06:46:52.277: E/AndroidRuntime(800): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
02-04 06:46:52.277: E/AndroidRuntime(800): at dalvik.system.NativeStart.main(Native Method) 
02-04 06:46:52.277: E/AndroidRuntime(800): Caused by: java.lang.InstantiationException: com.manarbushnaq.calorietracker.CalorieSelectorActivity 
02-04 06:46:52.277: E/AndroidRuntime(800): at java.lang.Class.newInstanceImpl(Native Method) 
02-04 06:46:52.277: E/AndroidRuntime(800): at java.lang.Class.newInstance(Class.java:1429) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
02-04 06:46:52.277: E/AndroidRuntime(800): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577) 
02-04 06:46:52.277: E/AndroidRuntime(800): ... 11 more 
+0

बीटीडब्ल्यू, क्या आप त्रुटि सामग्री कहीं भी डाल सकते हैं जहां हम जांच सकते हैं? पेस्टबिन या एक गिस्ट – DallaRosa

+1

मुझे यह कैसे करना है इस पर कोई संकेत नहीं होगा। क्या मैं शायद लॉगकैट पोस्ट कर सकता हूं? @DallaRosa –

+0

मैंने अपनी प्रतिक्रिया को उस सूचना को प्रतिबिंबित करने के लिए अपडेट किया जो मैंने नहीं देखा था जब मैंने पहली बार अपना प्रश्न पढ़ा था। – DallaRosa

उत्तर

17

अपने कोड को देखें: यहां तक ​​कि अगर आप अपने गतिविधि का एक वस्तु बनाने

CalorieSelectorActivity csa = new CalorieSelectorActivity(userName); 

Intent i = new Intent(thisContext, csa.getClass()); 

startActivity(i); 

, क्या आप "से गुजर रहे हैं" आशय वस्तु में activity object लेकिन सिर्फ class of your activity नहीं है। startActivity() में एंड्रॉइड फ्रेमवर्क आपकी गतिविधि के किसी ऑब्जेक्ट को तुरंत चालू करने का प्रयास करेगा। और यह डिफ़ॉल्ट कन्स्ट्रक्टर (पैरामीटर के बिना) को कॉल करता है जब यह करता है। यह विफल रहता है जब आपकी कक्षा में पैरामीटर के बिना कोई कन्स्ट्रक्टर नहीं होता है।

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

+0

मैं शुरुआत में ऐसा करने की कोशिश कर रहा था ताकि मैं गतिविधि वर्ग में एक कस्टम ऑब्जेक्ट पास कर सकूं क्योंकि मुझे वहां इसका उपयोग करने की आवश्यकता थी, लेकिन जब यह असफल रहा तो मैंने एक साधारण स्ट्रिंग की कोशिश की। मेरे प्रश्न में दिखाओ। तब मैंने आत्मसमर्पण कर दिया और इसे मंशा के माध्यम से पारित कर दिया। @ समीर –

+0

और इस तथ्य के बारे में कि मेरी कक्षा की घोषणा में तर्क है, और जिस वस्तु को मैं परिभाषित करता हूं वह वस्तु उस वर्ग पर आधारित है। एंड्रॉइड को डिफ़ॉल्ट गतिविधि कन्स्ट्रक्टर को तुरंत कॉल करने के बजाय उस क्लास कन्स्ट्रक्टर (जो अंततः डिफ़ॉल्ट गतिविधि कन्स्ट्रक्टर को कॉल करने के लिए कॉल करने की कोशिश नहीं करनी चाहिए)। मुझे वह अजीब व्यवहार मिलता है। @DallaRosa –

+2

मैं वास्तव में एक विशेषज्ञ नहीं हूं कि एंड्रॉइड फ्रेमवर्क कैसे कार्यान्वित किया जाता है। हालांकि, यहां समझने के लिए आवश्यक बात यह है कि ढांचा आपकी गतिविधि के ऑब्जेक्ट को तुरंत चालू करने के लिए प्रतिबिंब का उपयोग करता है। आपके द्वारा बनाई गई वस्तु को ढांचे द्वारा उपयोग नहीं किया जा रहा है। मैं सुझाव देता हूं कि आप जावा प्रतिबिंब पर पढ़ लेंगे। तो यह अजीब लग सकता है। – Sameer

0

क्या त्रुटि आप मिलता है? आप अपने निर्माण को कॉल करके अपनी गतिविधि के नए उदाहरणों में मूल्यों को पारित कर सकते हैं। यह आपकी समस्या का समाधान हो सकता है या नहीं भी हो सकता है लेकिन अगर आप अपने कन्स्ट्रक्टर को @override के साथ एनोटेट करते हैं तो क्या होता है?

यह कहा गया है कि, आपको वास्तव में उनको डेटा उपलब्ध कराने के लिए बंडल या intent.put विधियों का उपयोग करना चाहिए क्योंकि यदि आपकी गतिविधि को स्मृति मुक्त करने के लिए रोक दिया गया है तो उन मानों को सिस्टम द्वारा पुनर्स्थापित किया जा सकता है।

+0

मुझे जो त्रुटि मिल रही है वह है: –

+0

मुझे जो त्रुटि मिल रही है वह है: 02-04 03: 39: 58.297: ई/एंड्रॉइड रनटाइम (713): java.lang.RuntimeException: गतिविधि को चालू करने में असमर्थ ComponentInfo {com.manarbushnaq। कैलोरीट्रैकर/com.manarbushnaq.calorietracker.CalorieSelectorActivity}: java.lang.InstantiationException: com.manarbushnaq.calorietracker.CalorieSlectorActivity मैं संरचना के साथ झुकाव नहीं करना चाहता था, इसलिए मैं सुपर() को बुला रहा हूं। जैसा कि मैंने पहले कहा था कि यह ठीक काम करता है जब मैं बिना किसी पैरामीटर को छोड़कर एक ही कोड का उपयोग करता हूं।यह गतिविधि को छोड़कर हर दूसरे वर्ग के साथ काम करता है !!! –

0

तुम सच में एक Activity एक निर्माता है कि बनाने के लिए की जरूरत है (क्योंकि, कहते हैं, आप बना रहे हैं एक Activity कि इस तरह के एक Tasker प्लगइन की गतिविधि संपादित के रूप में किसी अन्य ऐप्स के शुरू किया जाएगा,), आप यह कर सकते हैं

class BaseActivity extends Activity 
{ 
    public BaseActivity(String parameter) 
    { 
     // Do something with parameter 
    } 
} 

class DerivedActivity extends BaseActivity 
{ 
    public DerivedActivity() 
    { 
     super("parameter"); 
    } 
} 

आप, पैरामीटर उत्पन्न एक समारोह कॉल कि उचित मान देता है साथ "parameter" को बदलने के लिए की जरूरत है: एक व्युत्पन्न वर्ग का उपयोग कर, के रूप में तो द्वारा।

+1

यह एक "हार्ड-कोडित पैरामीटर" है .. –

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