2012-03-26 3 views
9

私はこのスレッドを見ました:How to implement a listener実装リスナーについて。androidどのようにカスタム変数にリスナーを作るには?

実際にはかなりシンプルですが、私はどのように正確に完了し、自分のコードでどのように実装するのか分かりません。

私はこの静的変数変数AppLoader.isInternetOnを持っています。 この変数を聞くリスナーを作成して、TextViewを変更して更新したいと考えています。

これを行う必要がありますか?

ビルドインターフェース:

​​

実行それ私の活動の:あなたはそれを実際にリスナーを通知するクラスを逃している

public class MyActivity extends Activity { 
private InternetStateListener mListener; 

setTheListener(this); 

public void setTheListener(InternetStateListener listen) { 
    mListener = listen; 
} 

private void onStateChange() { 
    if (mListener != null) { 
     if (AppLoader.isInternetOn) 
     text.setText("on") 
     else 
     text.setText("off") 
    } 
    } 
} 

答えて

23

あなたの活動は、特別何もしない、(インタフェースはクラスに直接実装されているので)だけでリスナーを提供して他のクラスに自身を登録します。

public class MyActivity extends Activity implements InternetManager.Listener { 

    private TextView mText; 
    private InternetManager mInetMgr; 

    /* called just like onCreate at some point in time */ 
    public void onStateChange(boolean state) { 
     if (state) { 
      mText.setText("on"); 
     } else { 
      mText.setText("off"); 
     } 
    } 

    public void onCreate() { 
     mInetMgr = new InternetManager(); 
     mInetMgr.registerListener(this); 
     mInetMgr.doYourWork(); 
    } 
} 

他のクラスは、ほとんどすべての作業を行う必要があります。それ以外にも、何か起こったらonStateChangeメソッドを呼び出す必要があるリスナーの登録を処理する必要があります。

public class InternetManager { 
    // all the listener stuff below 
    public interface Listener { 
     public void onStateChange(boolean state); 
    } 

    private Listener mListener = null; 
    public void registerListener (Listener listener) { 
     mListener = listener; 
    } 

    // ----------------------------- 
    // the part that this class does 

    private boolean isInternetOn = false; 
    public void doYourWork() { 
     // do things here 
     // at some point 
     isInternetOn = true; 
     // now notify if someone is interested. 
     if (mListener != null) 
      mListener.onStateChange(isInternetOn); 
    } 
} 
+0

オハイオ州は今、建築が実現したと思います!どうもありがとう! –

+0

ありがとうございます。非常に良い、明確な説明。 – Kristopher

+0

インタフェースを継承しているクラスでは、 'mListener.onStateChange(boolean)'がインタフェースから直接呼び出されたときに 'onStateChange()'で通知されますか?そのようなインターフェイスは、変数を変更するタスクを完了した後、メインインターフェイスで変数が変更されたときはいつでも、クラスを継承するサブと通信していますか?ありがとう:) –

0

一部。したがって、実行してネットワークの状態をpingするクラス(ほとんどの場合、サービス)が必要になります。変更が検出されると、登録済みのリスナーでonStateChange()を呼び出す必要があります。次に、あなたの活動ではなく、そのサービスでsetTheListenerを呼び出します。ここで

は徹底的にこのデザインパターンを説明したリンクです:http://en.wikipedia.org/wiki/Observer_pattern

関連する問題