6

イベントを処理するには、次の2つの方法があります。

  1. たとえば、コールバックインターフェイスの実装

    public class A implements View.OnClickListener {
        public void onClick(View v) {
            ....
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
            aboutLayout = (LinearLayout) findViewById(R.id.aboutLayout);
            aboutLayout.setOnClickListener(this);
        }
    }
    
  2. コールバックインターフェイスを実装する内部クラスの作成

    public class ActivityAbout  {
        private class ViewClickListener implements View.OnClickListener {
            public void onClick(View v) {
                ..
            }
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
            ViewClickListener listener = new ViewClickListener();
            aboutLayout = (LinearLayout) findViewById(R.id.aboutLayout);
            aboutLayout.setOnClickListener(listener);
        }
    }
    

どちらがいいですか?

4

2 に答える 2

4

選択は、クラスの使用方法に完全に依存します。各メソッドは有効であり、対応する長所と短所があります。

  • 方法 1 は簡単にコーディングできますが、onClick()機能が 1 つに制限されるため、組織が混乱する場合とそうでない場合があります。
  • 方法 2 では、複数のonClick()関数を作成し、より論理的な方法で使用できます。

しかし、匿名のコールバックであるメソッド 3 を提示したいと思います。

public class MyActivity extends Activity {
    OnClickListener myClickListener1 = new OnClickListener() {
        public void onClick(View v) {
            ..
        }
    }

    OnClickListener myClickListener2 = new OnClickListener() {...}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        view.setOnClickListener(myClickListener1);
    }
}

方法 2 とは異なり、カスタム クラスを作成していないことに注意してください。機能を追加したり、ローカル変数を保持したり、OnClickListener の基本機能を変更したりしない限り、新しいカスタム クラスを作成することは避けます。

于 2012-09-09T19:30:29.367 に答える
1

コードが非常に長い場合 (および整理またはメソッド化する必要がある場合)、または同じコードを何度も使用する予定がある場合は、内部クラスを使用する傾向があります。Surfaceわかりやすくするために、私のコールバックも内部クラスとして編成されています。

コードが短くて扱いやすい場合 (おそらくイベント内の 1 行のみ) は、無名クラスを使用します。

イベントがクラス自体に直接関連している場合にのみ最初の実装を使用し、それに他のリスナーを接続する必要はありません。これは非常にまれな状況です。(単純なデバッグにも使用しますが、ここでは関係ありません。)

于 2012-09-09T19:29:18.587 に答える