दिलचस्प पोस्ट
कोणीय एन्कोडेड एंकर लिंक्स को अंगुलियोज़ के साथ कैसे तैयार किया जाए? सीएसएस: नहीं () चयनकर्ता को दूर के वंशज के साथ काम करना चाहिए? Resettable जावा टाइमर एचटीएमएल पाठ का चयन कैसे करें एंड्रॉइड में एक गतिविधि में सॉफ्टकेबोर्ड खुला और करीबी श्रोता? जावा में निर्देशिकाओं और उपनिर्देशिका से सभी फाइलों को सूचीबद्ध करें मेरी छवि के नीचे स्थान क्यों है? मेरी समानता = (एक एकल बराबर) का उपयोग सही ढंग से काम क्यों नहीं करता? Android में हैंडलर और मेमोरी लीक स्केलर्न से आयात करने में आयात की गई त्रुटि: नाम चेक_बिल्ड को आयात नहीं किया जा सकता पीएचपी: पैसे को बेजोड़ करना SQL सर्वर के लिए "पसंद" और "IN" का संयोजन ImageMagick – "CORE_RL_magick_.dll नहीं मिला" या रूबी 1.9.2 के साथ खिड़कियों पर RMagick कैसे स्थापित करें एक उपयोगकर्ता और SQL सर्वर में एक लॉगिन के बीच का अंतर खुद को डॉस के हमलों से बचाओ

मैं विधि के बजाय मेरी कक्षा के शीर्ष पर मेरी चर सेट करना चाहूंगा

मुझे इस भ्रामक समस्या से निपटने में प्रतीत नहीं होता है, मेरे पास बहुत सारे और बहुत सारी चीजें हैं जो मैं अव्यवस्था पर कटौती करने में मेरी कक्षा के शीर्ष पर जोड़ना चाहूंगा।

चूंकि कई तरीकों से इन चेकबॉक्स वेरिएबल्स का इस्तेमाल होता है

मैं शीर्ष पर सब कुछ सीधे खुलने वाले ब्रैकेट के नीचे करना चाहता हूं

यहाँ क्या काम करता है, लेकिन मैं क्या नहीं चाहता हूं:

public class MyClass extends Activity implements View.OnClickListener { //leaving out most code like onCreate. Just pretend it's there. public void checkboth(View view) { CheckBox cb1 = (CheckBox) findViewById(R.id.cb1); CheckBox cb2 = (CheckBox) findViewById(R.id.cb2); cb1.setchecked(true); cb2.setchecked(true); } @Override public void onClick(View v) { } } 

लेकिन मेरे जीवन के लिए मैं यह नहीं समझ सकता कि मैं ऐसा क्यों नहीं कर सकता:

 public class MyClass extends Activity implements View.OnClickListener { CheckBox cb1 = (CheckBox) findViewById(R.id.cb1); CheckBox cb2 = (CheckBox) findViewById(R.id.cb2); //leaving out most code like onCreate. Just pretend it's there. public void checkboth(View view) { cb1.setchecked(true); cb2.setchecked(true); } @Override public void onClick(View v) { } } 

वेब के समाधान से एकत्रित समाधान "मैं विधि के बजाय मेरी कक्षा के शीर्ष पर मेरी चर सेट करना चाहूंगा"

आप इस तरह से एक विधि के बाहर View एस शुरू नहीं कर सकते

 CheckBox cb1 = (CheckBox) findViewById(R.id.cb1); CheckBox cb2 = (CheckBox) findViewById(R.id.cb2); 

क्योंकि इसका मतलब यह होगा कि इन लाइनों को onCreate() से पहले चलाया जाता है जो इन चर को null और इन चर पर तरीकों को कॉल करने की कोशिश करते समय NPE फेंकते हैं। ऐसा इसलिए है क्योंकि आप setContentView(R.layout.your_layout) को setContentView(R.layout.your_layout) अंदर कहते हैं और उस Views अंदर आपके Views "लाइव" हैं इसका मतलब यह है कि जब तक setContentView() कॉल करके आपके layout को inflated नहीं जा रहा है, तब तक उनका आरंभ नहीं किया जा सकता। अपने Views को इनिशियलाइज़ करने का प्रयास करने से पहले आपको setContentView() कॉल करना होगा उस हिस्से के आसपास कोई रास्ता नहीं है।

क्या कुछ लोग ऐसा कर सकते हैं जो एक अलग फ़ंक्शन बनाने के लिए मदद कर सकता है जो इन परिवर्तनों को प्रारंभ करता है बस setContentView() बाद कहा जाता है। कुछ इस तरह

 public class MyActivity // declare your Views so they are global to the class TextView tv; // more views @Override public void onCreat(stuff) { // super call setContentView(R.layout.my_layout); init(); 

फिर अपने init() फ़ंक्शन में आपने जो भी Views को घोषित किया है उसे आरंभ करें

 private void init() { tv = (TextView) findViewById(R.id.myTextView); // more initializations } 

लेकिन आप सिर्फ उन्हें onResume() onCreate() , onResume() या तब तक प्रारंभ कर सकते हैं जब तक सेट के बाद के रूप में यह onResume() घोषित करना और उन्हें इस तरीके से आरंभ करना यह सुनिश्चित करेगा कि वे सभी अन्य कार्यों, श्रोताओं, आंतरिक कक्षाओं आदि के लिए उपलब्ध हैं। Activity । और अगर आपके पास बहुत सारे Views यह "अव्यवस्था" को थोड़ा कम कर सकता है

FindViewById एक ऐसा तरीका है, जो दृश्य के फुलाया गया होने के बाद गतिविधि (या किसी भी दृश्य समूह) से चलाया जा सकता है गतिविधि के स्तर को देखने के लिए, आप आमतौर पर setContentView पर कॉल करें

चूंकि setContentView को अभी तक नहीं बुलाया गया है, इसलिए गतिविधि से कोई दृश्य संलग्न नहीं है।

यहां है कि इसे कैसे करना है

 public class MyClass extends Activity implements View.OnClickListener { CheckBox cb1; CheckBox cb2; public void onCreate(Bundle sis) { super.onCreate(sis); setContentView(R.layout.whatever); cb1 = (CheckBox) findViewById(R.id.cb1); cb2 = (CheckBox) findViewById(R.id.cb2); } public void checkboth(View view) { cb1.setchecked(true); cb2.setchecked(true); } @Override public void onClick(View v) { } } 

आप यहां से विधि (findViewById) को कॉल नहीं कर सकते हैं और एक नल-मान की अपेक्षा कर सकते हैं। आपके द्वारा setContentView (R.layout.my_layout) को कॉल करने के बाद केवल एंड्रॉइड में ही दृश्य बनाए जाते हैं। आपको क्या करना है, ऐसा कुछ है:

 public class MyClass extends Activity implements View.OnClickListener { CheckBox cb1 = null; CheckBox cb2 = null; //leaving out most code like onCreate. Just pretend it's there. public void onCreate(Bundle savedInstanceState) { super.onCreate(); setContentView(R.layout.my_layout); cb1 = (CheckBox) findViewById(R.id.cb1); cb2 = (CheckBox) findViewById(R.id.cb2); } public void checkboth(View view) { cb1.setchecked(true); cb2.setchecked(true); } @Override public void onClick(View v) { } } 

जब आप घोषणाओं को कक्षा के शीर्ष पर ले जाते हैं, तो आप स्थानीय चर को फ़ील्ड में बदलते हैं। ये फ़ील्ड आरंभीकृत हो जाती हैं जब एक उदाहरण बनाया जाता है – जिसका अर्थ है कि वे कंसट्रेटर निष्पादित "ठीक पहले" आरंभ किए जाते हैं।

अब, आप super() खत्म करने के लिए अंतर्निहित कॉल से पहले इंस्टेंस विधियों (जैसे findViewById ) को कॉल नहीं कर सकते

उन्हें कन्स्ट्रक्टर पर ले जाएं, और चीजों को काम करना चाहिए।