4

私のタイトルについてお詫び申し上げます。問題を適切に表現するのに苦労しています。

OnCLickListener私は2つの方法で実装されているのを見てきました。1 つ目は、クラスが を実装していることを示すことによって行われますOnCLickListener。2 つ目は、自分で宣言することでタスクを達成します。

this最初のオプションでは引数として簡単に入力できるのに、2 番目のオプションでは自分でオブジェクトsetOnCLickListenerを作成するという手間がかかるのはなぜですか?OnClickListener

最初:

public class WidgetConfig extends Activity implements OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.widgetconfig);
    Button b = (Button)findViewById(R.id.bwidgetconfig);
    b.setOnClickListener(this);
    }
    //onClick defined outside of the onCreate
    @Override
    public void onClick(View arg0) {
    // TODO Auto-generated method stub

    }

二番目:

public class WidgetConfig extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.widgetconfig);
    Button b = (Button)findViewById(R.id.bwidgetconfig);
    b.setOnClickListener(bListener);
}



private Button bListener = new OnClickListener(){

b.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {

            //TO-DO 

            }
});
4

5 に答える 5

4

最初のメソッドでは、Activity クラス全体でインターフェイスを実装しOnClickListenerます。OnClickListenerすべての View の をthisに設定すると、すべてのクリック イベントを 1 つのメソッドで受け取ることができます。ここで、それらをフィルタリングして操作することができます。

2 番目のメソッドは、インターフェイス メソッドを実装する匿名内部クラスを使用します。このアプローチを使用すると、その特定のビューのイベントのみを受け取ります。

最初の方法では、クラス全体で の 1 つのインスタンスを使用しますOnClickListener。これは、クリックをリッスンするすべてのビューに渡されます。

2 番目の方法は、次のように変換されます。

Button.OnClickListener anonymous_listener = new Button.OnClickListener() { ... };
button.setOnClickListener(anonymous_listener);

つまり、OnClickListener使用時に新しいインスタンスを動的に作成して保存します。

于 2013-07-09T04:44:14.583 に答える
1

オブジェクトを保存するため、通常は最初の方法を使用します。ただし、多くのリスナーを実装する必要がある場合は、コードをより整理して整然とした状態に保つために、2 番目の方法を検討できます。

于 2013-07-09T04:39:32.283 に答える
1

ケース 1 は、タイプandthisのオブジェクトを表します。したがって、b.setOnClickListener(this) を渡すと、「OnClickListener」タイプのオブジェクトを表します。 ActivityOnClickListenerthis

ケース 2では、 anonymous objectof typeを渡していますOnClickListener。したがって、匿名オブジェクト内でメソッドを定義する必要がありOnClickListenerます。interfaceonClick

于 2013-07-09T04:41:37.350 に答える
1

ActivityクラスonClickListenerの (ほとんどの) メソッドとメンバー変数にアクセスする必要がある場合は、最初の方法を使用してコードを簡素化できます。また、すべての " " を同じ方法で処理したい場合にも適しています。onClick

それ以外の場合、多数のボタン (またはクリック処理を必要とする他のタイプのビュー) があり、それらすべてを異なる方法で処理する必要がある場合は、2 番目のオプションを使用する必要があります。その場合、Activityで 1 つのボタン (ビュー) を処理するのは意味がなくonClick、残りのボタンは個々onClickListenerの によって処理されます。これにより、コードの一貫性が失われます。

于 2013-07-09T04:50:35.983 に答える