2011-11-14 10 views
2

リスナーにリスナーを作成することが可能かどうかを知りたいです。たとえば、ボタンのリスナーがある場合、そのリスナーのリスナーを作成して、ボタンを押すとボタンリスナーのリスナーに通知されるようにすることができます。どのようにJavaの仕事のリスナーを行う

他の懸念事項は、関数呼び出しの中にいくつかのリスナーが含まれていて、これらのリスナーが関数呼び出しの戻り時に破棄されるということです。たとえば、メインプログラムのリスナーにリスナーがあるプログラムの冒頭で呼び出す関数を使用できますか?

+2

なぜリスナーをリスナーにする必要がありますか?ボタンリスナーに通知されたときにメソッドを呼び出すことはできませんか? – Tudor

+0

私は通常、人々が正当な理由を持っていると思っているので、「なぜそれが好きなのですか?」と尋ねるのは普通ではありませんが、なぜそれは好きですか?最初のリスナーで必要な作業は何でもしてください。また、ボタンに複数のリスナーを設定したり、リスナーに「ハンドラー」のリストを表示したりするのはなぜですか? –

+0

基本的には、プロジェクトにjarやクラスを追加してから、アプリケーションのソース自体の変更を最小限に抑えるために、最初に一度初期化してください。 –

答えて

2

もちろん可能です。リスナー、または「オブザーバーパターン」はかなり簡単です。オブザーバパターンが実際に行うことは、すべての人に特定のメソッドが実装されていることを知らせる「コントラクト」を作成するインターフェイスを使用することです。そのメソッドを呼び出すことができると確信できます。

したがって、たとえば、あなたがこのような二つのインタフェースを作成することができます

public interface OnClickListener { 
    public void onClick(); 
} 

pubic interface SomeOtherListener { 
    public void onFoo(); 
} 

、これらのメソッドを「トリガー」を希望するコードを、それらのリスナーへの参照を持っている必要があります。通常、これは「パブリックメソッドを公開してリスナーを設定する」ことによって行われます。そこで、あるクラスでは、public void setOnClickListener() { this.onClickListener = listener; }を持っています。リスナーを実装するクラスは、setListener(this)を呼び出すことができます。 Javaのインターフェースはあなたにその種の多態性を与えるので、ここでは "this"が機能することに注意してください。クラスを実装するスーパークラスまたはインターフェースのいずれかにクラスをキャストできます。たとえば、 "onClick"を呼びたいクラスでは、 "onClick"を含むクラスが "onClickListener"であることが気になるだけです。それはすべてのクラスの心配です。 OnClickを実装するクラスがSomeOtherListenerへの参照を持っていれば、onClickはsomeOtherListener.onFoo();を呼び出すことができます。

デザイン)は、関連するオブジェクト/クラスが必要とするリスナーへの参照を持つように、必要な数の相互関係のあるリスナーを技術的に設定することができます。

ご迷惑をおかけして申し訳ありません。また、正確に何をしたいかについての詳細な説明がなく、より詳細な説明を提供するのは難しいです。

EDIT

私の知る限り、AndroidアプリですべてのGUIイベントをログに記録するように、いくつかの「キャッチオール」を設定することはできません。インターフェイスメソッドは実装する必要がある空のメソッドとして宣言されているため、実装したいと思う正確なログを指定する必要があります。たとえば、setOnClickListenerが呼び出されるたびに、何かを記録するためにAndroidソースをハックアップすることはできますが、それは非常に便利だとは思いません。また、これは暗黙のうちに、利用可能なすべてのタイプのリスナーに対して行う必要があることです。どのような種類のログでも、実装するリスナーのみが使用可能になります。たとえば、onTouchを実装していない場合、表示するログはありません。

+0

基本的には、アンドロイドソースのコード変更を最小限に抑えながら、アンドロイドアプリケーションのGUIインタラクションのすべてのイベントを記録することです。たとえば、私はいくつかの種類のjarまたはプロジェクトにクラスを追加して、アンドロイドアプリケーション内のコードの2行で初期化し、その後、GUIとのすべてのイベントのやりとりをログに記録したいと思います。何をしようとしているのは、GUIからすべてのコントロールを取得し、リスナーを動的に作成することです。私はGUIから生成されたすべてのイベントを記録しようとします。これを行うより良い方法があればshare.Thanks! –

2

リスナーは、単にイベントを宣伝する方法です。通常、リスナーに通知するオブジェクトには、リスナーのリストを保持するコレクションがあります。イベントがあると、それは単に移動し、リスト内のすべてのリスナーに通知します。

リスナーのリスナーを作成できます。その単純な連鎖。したがって、リスナーにはリスナーのリストが通知されます。

通常、リスナーはオブジェクト内に存在し、関数呼び出しではありません。したがって、通常、リスナーに通知するオブジェクト内にリスナーを追加/削除する方法を作成します。

+0

回答をいただきありがとうございます。基本的には、アンドロイドソースのコード変更を最小限に抑えながら、アンドロイドアプリケーションのGUIインタラクションのすべてのイベントをログに記録しています。たとえば、私はいくつかの種類のjarまたはプロジェクトにクラスを追加して、アンドロイドアプリケーション内のコードの2行で初期化し、その後、GUIとのすべてのイベントのやりとりをログに記録したいと思います。ありがとう! –

+0

OKです。 Cheers Sid –

1

インターフェイス+ストラテジー(ポリシー)とブリッジの設計パターンについて読むことができます。通常、Javaのリスナーは、単一のインスタンスではなく複数のインタフェースを持つという違いのある戦略のように実装されています。

public class MyClass{ 
public List<IListener> _listeners; 
public boolean registerListener(IListener listener){..} 
public boolean removeListener(IListener listener){...} 
public void doSomething(){ 
    if(something){ 
     //foreach listener do listener.doSomthing(); 
    } 
} 
} 

したがって、IListenerはこのインターフェイスを実装し、実装をMyClassに登録することができます。

+0

基本的には、アンドロイドソースのコード変更を最小限に抑えながら、アンドロイドアプリケーションのGUIインタラクションのすべてのイベントをログに記録しようとしています。たとえば、私はいくつかの種類のjarまたはプロジェクトにクラスを追加して、アンドロイドアプリケーション内のコードの2行で初期化し、その後、GUIとのすべてのイベントのやりとりをログに記録したいと思います。何をしようとしているのは、GUIからすべてのコントロールを取得し、リスナーを動的に作成することです。私はGUIから生成されたすべてのイベントを記録しようとします。これを行うより良い方法があればshare.Thanks! –

関連する問題