2013-01-22 72 views
14

我一直在尋找一個如何做到這一點的KISS例子,雖然他們都似乎(我經歷了他們所有!)足夠簡單,我仍然無法讓我的頭這個概念。我指的是自定義偵聽器(不擴展任何東西)...特別是,創建一個布爾變量的偵聽器,以便在其值更改時引發一些方法。Android:聽變化的變化

這是我試過的例子的一個例子: android how to make listener to a custom variable?

如果有人有時間來解釋一個自定義的監聽器,它的工作原理簡單的英語,這將是非常讚賞。我希望一旦我明確瞭解了聽衆如何得到改變的通知,那麼我就可以創建自己的並瞭解該死的事情是如何工作的。這讓我頭疼......在此先感謝

這裏就是我在此刻:

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); 
     } 
    } 


} 

這是我的主要活動的快照:

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(); 
    } 


} 

現在,當活動開始時,吐司顯示噓聲的狀態...很好。問題是這隻發生在onCreate中,這是有道理的,因爲.somethingChanged被放置在那裏。我希望每次boo從false變爲true時都會生成Toast,並且無論onCreate是否爲false,都會生成Toast。即:

  • 點擊一個按鈕
  • 原因噓從假更改爲真
  • 監聽器上的變化拿起並運行無論是在的onChange

我知道我可以只使用按鈕actionListener來做到這一點,但如果可能的話,我想遠離這一點,目前我開始認爲這是不可能的。

任何有識之士將不勝感激。提前致謝!

+0

我正在考慮使用簡單的setX/getX方法來改變值和其他方法。這可能會是足夠的,但我仍然認爲,如果可以在Java中執行,我的原始請求具有很大的價值。評論/解決方案仍然感激。謝謝 – user1977217

回答

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(); 
    } 
}); 

PS。 Toast必須從UI線程中調用,因此如果要在另一個線程中更改變量,則需要切換Looper。這可能不會出現。