2011-08-23 15 views
27

एक एंड्रॉइड ऐप में (या जावा अधिक आम तौर पर यदि यह अलग नहीं है), जब भी चर का मान बदलता है तो विधि को कॉल करने का सबसे अच्छा तरीका क्या है?एंड्रॉइड में, जब भी एक चर बदलता है मैं एक कार्रवाई कैसे करूं?

+0

कोड का कुछ टुकड़ा होना चाहिए जो चर बदलता है - आप वहां कार्रवाई क्यों नहीं करते हैं? –

+9

क्योंकि जब ऑब्जेक्ट को वेरिएबल चेंज बदलते हैं तो वे ऑब्जेक्ट को एक्सेस करने की आवश्यकता होती है। – tsvallender

उत्तर

54

क्या तुम सच में ऐसा करने के लिए जब एक घटना होती हैं एक श्रोता को गति प्रदान करने घटना चालित मॉडल की स्थापना की है हैं (जैसे अपने मामले में, एक चर मूल्य बदल गया है का कहना है: आप अपने कोड में अपने आवश्यकता के अनुसार डाल सकते हैं)। यह विशेष रूप से यूआई प्रोग्रामिंग के संदर्भ में और साथ ही बहुत ही सामान्य न केवल जावा के लिए है, लेकिन अन्य प्रोग्रामिंग भाषाओं के लिए है (हालांकि यह जरूरी ही नहीं के लिए नहीं है)

आमतौर पर यह निम्न चरणों का पालन कर रही द्वारा किया जाता है:

  • ईवेंट के मामले में श्रोता को लागू करने वाले इंटरफ़ेस को ट्रिगर किया गया है। आपके मामले के लिए, आप यह VariableChangeListener कॉल और के रूप में इंटरफ़ेस निर्धारित कर सकते हैं:


    public interface VariableChangeListener { 
     public void onVariableChanged(Object... variableThatHasChanged); 
    } 

आप किसी भी तर्क आपको लगता है कि यह महत्वपूर्ण है कि श्रोता यहाँ संभाल करने के लिए डाल सकता है। इंटरफ़ेस में सारण करके, आपके पास चर के मामले में आवश्यक कार्रवाई को कार्यान्वित करने की लचीलापन है, जिसने घटना के दौरान कक्षा के साथ इसे तंग कर दिया है।

  • कक्षा में जहां घटना हुई थी (फिर से आपके मामले में, कक्षा जहां परिवर्तक बदल सकता है), घटना के लिए श्रोता रजिस्टर करने के लिए एक विधि जोड़ें। आप अपने इंटरफेस VariableChangeListener को कॉल करते हैं तो आप एक विधि जैसे

    // while I only provide an example with one listener in this method, in many cases 
    // you could have a List of Listeners which get triggered in order as the event 
    // occurres 
    public void setVariableChangeListener(VariableChangeListener variableChangeListener) { 
     this.variableChangeListener = variableChangeListener; 
    } 

डिफ़ॉल्ट रूप से कोई एक घटना

  • सुन रहा है घटना के मामले में हुई (चर बदल गया है) होगा , आप तो श्रोता को गति प्रदान करेगा, कोड फिर


    if(variableValue != previousValue && this.variableChangeListener != null) { 
     // call the listener here, note that we don't want to a strong coupling 
     // between the listener and where the event is occurring. With this pattern 
     // the code has the flexibility of assigning the listener 
     this.variableChangeListener.onVariableChanged(variableValue); 
    } 

की तरह कुछ की तरह लग रहे हैं टी प्रोग्रामिंग में उनका एक बहुत ही सामान्य अभ्यास है जो मूल रूप से किसी ईवेंट या परिवर्तनीय परिवर्तन पर प्रतिक्रिया करता है। जावास्क्रिप्ट में आप देखते हैं कि यह ऑनक्लिक() के हिस्से के रूप में है, एंड्रॉइड में आप OnClickListener पर OnClickListener पर विभिन्न श्रोता के लिए ईवेंट संचालित मॉडल की जांच कर सकते हैं, जो Button ऑनक्लिक ईवेंट पर सेट है। आपके मामले में आप अलग-अलग ईवेंट के आधार पर श्रोता को ट्रिगर करेंगे, जब भी वैरिएबल बदल गया है

+7

मैं * सोचता हूं * अंततः आपने इस स्पष्टीकरण के साथ श्रोताओं पर मेरे लिए पैसा छोड़ने में मदद की हो सकती है। यह पृष्ठ बुकमार्क किया जा रहा है !!! –

+1

कोई व्यक्ति समझा सकता है कि 'setVariableChangeListener' विधि को किस प्रकार कहा जाना चाहिए? चूंकि 'वेरिएबल चेंजलिस्टर' एक इंटरफ़ेस है, जो वास्तव में 'setVariableChangeListener' में पारित हो जाता है? – AvP

-4

आप इसे इस तरह बना सकते हैं। जैसा कि आपने परिभाषित नहीं किया है कि आप वास्तव में क्या चाहते हैं। यह काम कर सकता है। मान लें कि आपका वैरिएबल नाम v है। एक वैरिएबल पिछला_वी ले लो। पिछला_वी = बनाओ; ।

if(v!=previous_v){ 
//your stuffs 
} 
+3

यह काम नहीं करेगा, क्योंकि यह केवल एक बार जांच करेगा, फिर कभी जांच न करें। लेखक जानना चाहता है कि जब वैरिएबल बदल जाता है, पृष्ठभूमि की तरह, जबकि लूप जो जांच करता रहता है। –