2013-01-22 13 views
14

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

इस एक उदाहरण की एक उदाहरण मैं कोशिश की है है: android how to make listener to a custom variable?

किसी समय एक कस्टम श्रोता व्याख्या करने के लिए है और यह कैसे सादे अंग्रेजी में काम करता है, कि बहुत सराहना की जाएगी है। मैं उम्मीद कर रहा हूं कि एक बार जब मैं समझता हूं कि श्रोता को परिवर्तन की अधिसूचना कैसे दी जाती है, तो मैं अपना खुद का निर्माण कर सकता हूं और समझ सकता हूं कि लापरवाही कैसे काम करती है। यह मैं पहले से सिर में दर्द दे रहा है ... धन्यवाद

वह स्थान है जहां मैं इस समय में हूँ:

public class Main extends Activity implements ChangeListener.listener{ 
    private ChangeListener listener; 
    private boolean boo = false; 

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

     listener = new ChangeListener(boo); 
     listener.setChangeListener(this); 
     listener.somethingChanged(); 

    } 

    @Override 
    public void onChange(boolean b) { 
     // TODO Auto-generated method stub 
     Toast.makeText(this, "REST = "+b, Toast.LENGTH_SHORT).show(); 
    } 


} 

:

public class ChangeListener { 
    boolean boo = false; 

    public ChangeListener(boolean b){ 
     boo = b; 
    } 

    private listener l = null; 

    public interface listener{ 
     public void onChange(boolean b); 
    } 

    public void setChangeListener(listener mListener){ 
     l = mListener; 
    } 

    public void somethingChanged(){ 
     if(l != null){ 
      l.onChange(boo); 
     } 
    } 


} 

यह मेरा मुख्य गतिविधि का एक स्नैपशॉट है अब, जब गतिविधि शुरू होती है, टोस्ट बू की स्थिति प्रदर्शित करता है ... बढ़िया। समस्या यह है कि केवल क्रिएट के भीतर ही होता है, जो समझ में आता है। कुछ चीजें वहां रखी जाती हैं। मैं चाहता हूं कि टोस्ट को हर बार झूठ से सच्चाई में बदल दिया जाए, और झूठ बोलने के लिए सच है, भले ही यह क्रेट या नहीं हो। अर्थात्:

  • एक बटन पर क्लिक करें
  • कारणों को असत्य से सत्य
  • श्रोता को बदलने के लिए बू परिवर्तन पर ऊपर उठाता है और चलाता है जो कुछ onChange

में है मैं जानता हूँ कि मैं सिर्फ इस्तेमाल कर सकते हैं बटन एक्शन लिस्टनर ऐसा करने के लिए, लेकिन यदि संभव हो तो मैं इससे दूर रहना चाहूंगा, जिस समय मैं सोचना शुरू कर रहा हूं असंभव है।

किसी भी अंतर्दृष्टि की सराहना की जाएगी। अग्रिम में धन्यवाद!

+0

मैं मूल्य और सेटऑफ अन्य विधियों को बदलने के लिए सरल सेटएक्स/गेटएक्स विधियों का उपयोग करने पर विचार कर रहा हूं।यह शायद पर्याप्त होगा लेकिन मुझे अभी भी लगता है कि जावा में ऐसा करने के लिए मेरे मूल अनुरोध का बहुत मूल्य है। टिप्पणियां/समाधान अभी भी सराहना की। धन्यवाद – user1977217

उत्तर

3

मुझे लगता है कि आप जो चाहते हैं उसका उत्तर यहां दिया गया है। यह वही है जब मैंने एक बूलियन वैल्यू को सुनने की आवश्यकता थी जिसे https://stackoverflow.com/a/7157281/2258389

+0

कृपया अपनी पोस्ट में प्रासंगिक उद्धरण जोड़ें –

14

आप एक कस्टम क्लास के अंदर चर को लपेटते हैं जैसे कि केवल एक्सेस फ़ंक्शन श्रोता की यात्रा भी करते हैं। इसलिए स्विच को फ़्लिप करने का एकमात्र तरीका उन कार्यों के माध्यम से होता है जो श्रोता को टॉगल करते हैं और कॉल करते हैं।

public class BooVariable { 
    private boolean boo = false; 
    private ChangeListener listener; 

    public boolean isBoo() { 
     return boo; 
    } 

    public void setBoo(boolean boo) { 
     this.boo = boo; 
     if (listener != null) listener.onChange(); 
    } 

    public ChangeListener getListener() { 
     return listener; 
    } 

    public void setListener(ChangeListener listener) { 
     this.listener = listener; 
    } 

    public interface ChangeListener { 
     void onChange(); 
    } 
} 

परिवर्तन आप BooVariable.ChangeListener को लागू करने और उसके बाद BooVariable वर्ग की एक प्रति "इस" तब, जब आप चर बदलने यह onChange कॉल पास करनी होगी निगरानी करने के लिए।

इसके अलावा, ध्यान में रखते हुए आप सिर्फ कोड इनलाइन कर सकते हैं के बजाय सीधे विस्तार:

BooVariable bv = new BooVariable(); 
bv.setListener(new BooVariable.ChangeListener() { 
    @Override 
    public void onChange() { 
     Toast.makeText(MainActivity.this,"blah", Toast.LENGTH_LONG).show(); 
    } 
}); 

पी एस। टोस्ट को यूआई थ्रेड से बुलाया जाना चाहिए, इसलिए यदि आप चर को एक अलग थ्रेड में बदलने जा रहे हैं तो आपको लूपर को स्विच करने की आवश्यकता है। हालांकि यह संभव नहीं होगा।

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