2011-11-15 8 views
3

imは1つのボタンに対して2つのリスナーを設定しようとしています。ここに私のコードは次のとおりです。 これはこれは私がメインコードでオブジェクトを作成するクラスであるメインコードワンボタン2つのリスナーをJavaで実装

  public class LoggingEventsActivity extends Activity implements OnClickListener { 
       /** Called when the activity is first created. */ 
       @Override 
       public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 

        temp obj = new temp(R.id.button1,this); 

        View continueButton = findViewById(R.id.button1); 
        continueButton.setOnClickListener(this); 
       } 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 

        final TextView t=(TextView)findViewById(R.id.editText1); 
        t.setText("hello world"); 

       } 
      } 

です:

  public class temp extends Activity implements OnClickListener{ 


       public temp(int id, LoggingEventsActivity ref){ 
        try{ 

        View continueButton = findViewById(id); 
        continueButton.setOnClickListener(ref); 
        } 
        catch (Exception e){ 
         e.printStackTrace(); 
        } 
       } 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        final TextView t=(TextView)findViewById(R.id.editText1); 
        t.append("extra"); 
       } 

      } 

私はここに、nullポインタ例外を得ることがlogcatあり続けますダンプ:

  11-15 11:08:29.589: W/System.err(24268): java.lang.NullPointerException 
      11-15 11:08:29.605: W/System.err(24268): at android.app.Activity.setContentView(Activity.java:1835) 
      11-15 11:08:29.616: W/System.err(24268): at events.log.temp.<init>(temp.java:15) 
      11-15 11:08:29.635: W/System.err(24268): at events.log.LoggingEventsActivity.onCreate(LoggingEventsActivity.java:17) 
      11-15 11:08:29.655: W/System.err(24268): at android.app.Activity.performCreate(Activity.java:4465) 
      11-15 11:08:29.664: W/System.err(24268): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
      11-15 11:08:29.675: W/System.err(24268): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 
      11-15 11:08:29.685: W/System.err(24268): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 
      11-15 11:08:29.696: W/System.err(24268): at android.app.ActivityThread.access$600(ActivityThread.java:122) 
      11-15 11:08:29.704: W/System.err(24268): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) 
      11-15 11:08:29.715: W/System.err(24268): at android.os.Handler.dispatchMessage(Handler.java:99) 
      11-15 11:08:29.725: W/System.err(24268): at android.os.Looper.loop(Looper.java:137) 
      11-15 11:08:29.735: W/System.err(24268): at android.app.ActivityThread.main(ActivityThread.java:4340) 
      11-15 11:08:29.744: W/System.err(24268): at java.lang.reflect.Method.invokeNative(Native Method) 
      11-15 11:08:29.766: W/System.err(24268): at java.lang.reflect.Method.invoke(Method.java:511) 
      11-15 11:08:29.784: W/System.err(24268): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
      11-15 11:08:29.784: W/System.err(24268): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
      11-15 11:08:29.795: W/System.err(24268): at dalvik.system.NativeStart.main(Native Method) 
      11-15 11:08:37.355: D/gralloc_goldfish(24268): Emulator without GPU emulation detected. 
      11-15 11:09:34.365: D/dalvikvm(24268): Debugger has detached; object registry had 441 entries 
      11-15 11:14:20.436: W/System.err(24548): java.lang.NullPointerException 
      11-15 11:14:20.445: W/System.err(24548): at android.app.Activity.findViewById(Activity.java:1794) 
      11-15 11:14:20.445: W/System.err(24548): at events.log.temp.<init>(temp.java:15) 
      11-15 11:14:20.445: W/System.err(24548): at events.log.LoggingEventsActivity.onCreate(LoggingEventsActivity.java:17) 
      11-15 11:14:20.455: W/System.err(24548): at android.app.Activity.performCreate(Activity.java:4465) 
      11-15 11:14:20.455: W/System.err(24548): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
      11-15 11:14:20.455: W/System.err(24548): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 
      11-15 11:14:20.455: W/System.err(24548): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 
      11-15 11:14:20.455: W/System.err(24548): at android.app.ActivityThread.access$600(ActivityThread.java:122) 
      11-15 11:14:20.455: W/System.err(24548): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146) 
      11-15 11:14:20.455: W/System.err(24548): at android.os.Handler.dispatchMessage(Handler.java:99) 
      11-15 11:14:20.465: W/System.err(24548): at android.os.Looper.loop(Looper.java:137) 
      11-15 11:14:20.465: W/System.err(24548): at android.app.ActivityThread.main(ActivityThread.java:4340) 
      11-15 11:14:20.465: W/System.err(24548): at java.lang.reflect.Method.invokeNative(Native Method) 
      11-15 11:14:20.475: W/System.err(24548): at java.lang.reflect.Method.invoke(Method.java:511) 
      11-15 11:14:20.475: W/System.err(24548): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
      11-15 11:14:20.475: W/System.err(24548): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
      11-15 11:14:20.475: W/System.err(24548): at dalvik.system.NativeStart.main(Native Method) 
+0

は、なぜあなたは1つのボタンの2人のリスナーを必要とするファイルに書き込まれます、結果を送り返しますRMIクラスを作成するのですか? – hovanessyan

+0

なぜそれをしますか? – lc2817

+0

@ lc2817 1つのリスナーが最後を記録し、もう1つがアクションを実行します。私はアクションのコードから別々のログを記録するコードを保持したいので、これらを1つにまとめる必要はありません。 –

答えて

9

CompositeListenerパターンを使用してください。私はの別の懸念にしたいので、私はそれをすべて使用し、匿名ではなく、外部クラスで私のリスナーを保持します。

アイデアは、それが参照したいすべてのリスナーへの参加者は、そのすべてのonClick通話ユニークなリスナーを持つことが基本的です。美しいことは、そのパターンを任意の種類のリスナー(カスタムのものさえ)に適用できることです。

(以下を迅速にSOエディタでメモリからコード化され、それは構文エラーを含んでいてもよいが、あなたのアイデアを与えるだろう)

public class CompositeOnClickListener implements OnClickListener { 
    private final Set<OnClickListener> delegates = new HashSet<OnClickListener>(); 

    public CompositeOnClickListener(OnClickListener... listeners) { 
     for (OnClickListener listener : listeners) { 
      delegates.add(listener); 
     } 
    } 

    @Override 
    public void onClick(View v) { 
     for (OnClickListener listener : delegates) { 
      listener.onClick(v); 
     } 
    } 
} 

あなたはこれらのいずれかを作成し、それをあなたが望むすべてのリスナーを養いますあなたのログリスナを含む(あなたのボタンに渡す:

OnClickListener myListener = new CompositeOnClickListener(listener1, listener2, listener3); 

そして、あなたはあなたのボタンに追加します。

Button continueButton = (Button) findViewById(R.id.button1); 
continueButton.setOnClickListener(myListener);  
+0

こんにちはありがとうございます。しかし、これはリスナーを作成するすべてのコードセグメントを変更する必要があります。私は外部コードを追加したいと思っており、アプリケーションのソースコードの変更を最小限に抑えたいと思っています。基本的には、可能であれば、アプリケーションソースからログコードを完全に分離したいと思っています。ありがとう –

+1

あなたは "メイン"コードを変更しないで、それを拡張したいと言っていますか?あなたの "temp"クラスはCompositeListenerになり、内部的なリスナーセットを保持し、onClickメソッドですべてを反復処理し、onClickメソッドを呼び出すことができます。 – Guillaume

+0

はいコードを変更しないでください。私は両方の方法を試すことができ、どの方がうまくいくかを見るために新しい答えを投稿してください。ありがとう! –

1

あなたが新しいとActivityをインスタンス化することはできません、あなたはを使用する必要があります活動、第二のものを起動する、あなたがこのようなマニフェストファイルにそれを宣言しなければならないことである。<activity android:name="TempActivity" />

NB:あなたの活動TempActivityに、あなたはあなたの見解などを初期化する方法onCreate()をオーバーライドする必要があります...

+0

私は新しいアクティビティを作成したくありません。リスナを作成したいので、メインアクティビティ –

+0

のボタンイベントを記録できるのですが、どうしてクラスの一時ファイルを作成しましたか?ボタンに2つのステートメントを実行させたい場合は、1つのリスナーで十分です。そして、ブール値を使用して2つのステートメントを切り替えます。 – Houcine

+0

@MikeGこれもNULLポインターの原因です。ボタンを含むアクティビティとは別のアクティビティでidでビューを検索しようとしています。 – Jim

1

OK 1つの解決策は、ボタンをクリックして2つの異なるスレッドを作成し、各スレッドにアクションの1つをさせることです。

2番目の解決方法は、mainメソッドを使用していわゆるLoggerクラスを作成し、コンピュータの一部のポートに実装することです。ボタンをクリックすると、ソケットを介してクラスが呼び出されます。

第3の可能な解決策数行のコードを使用して、プログラムがロギングを行うと

+0

こんにちは、お返事ありがとう、ちょうど私が探していることthats。あなたはあなたの答えを編集して、2番目の解決方法の使い方の詳細を記入してください。私はアンドロイドのdevとjavaに新しいので、コードを含めて非常に高く評価されるだろう。ありがとう! –

+0

これらのソリューションは、達成したいと思うほど複雑すぎます。マルチスレッド?ソケット? RMI?ボタンにログを追加するだけですか? – Guillaume

+0

@Guillaumeこれは、ボタンだけでなく、より多くのコントロールにも展開したいと考えています。ボタンにロギングを追加するとどういう意味ですか?それはどのように機能するのですか?他のコントロールにも拡張できますか?ありがとう –

関連する問題