web-dev-qa-db-ja.com

Android-setOnClickListener vs OnClickListener vs View.OnClickListener

私の理解では、クリックをリッスンするボタンオブジェクトを作成する場合、次のことを行う必要があります。

  1. ボタンオブジェクトを作成する
  2. OnClickListnerを使用して、ユーザーのクリックをリッスンさせます
  3. onClickを使用して、ユーザーがボタンをクリックした後にアクションを実行します

さて、

  • setOnClickListenerは上記のロジックのどこに収まりますか?
  • ボタンクリックを実際に聞いているのはどれですか?
  • setOnClickListener
  • OnClickListener
  • View.OnClickListener
  • これら3つの違いは何ですか?

Android Devで見つけたものは次のとおりです。

//The example below shows how to register an on-click listener for a Button.

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
    ...
}

OnClickListenerActivityの一部として実装する方が便利な場合もあります。これにより、余分なクラスのロードとオブジェクトの割り当てが回避されます。例えば:

public class ExampleActivity extends Activity implements OnClickListener {
    protected void onCreate(Bundle savedValues) {
        ...
         Button button = (Button)findViewById(R.id.corky);
         button.setOnClickListener(this);
    }

    // Implement the OnClickListener callback
    public void onClick(View v) {
      // do something when the button is clicked
    }
}
32
ninjayoto

ロジックは単純です。 setOnClickListenerはステップ2に属します。

  1. ボタンを作成します
  2. その例のようにOnClickListener *のインスタンスを作成し、onClick- methodをオーバーライドします。
  3. フラグメント/アクティビティOnClickListener- methodのbtn.setOnClickListener(myOnClickListener);を使用して、そのボタンにonCreateを割り当てます。
  4. ユーザーがボタンをクリックすると、割り当てられたonClickOnClickListener関数が呼び出されます。

* import Android.view.View;を使用する場合は、View.OnClickListenerを使用します。 import Android.view.View.*;またはimport Android.view.View.OnClickListener;を使用する場合、OnClickListenerを使用します。

別の方法は、アクティビティ/フラグメントをOnClickListenerから継承させることです。このようにして、フラグメント/アクティビティをボタンのリスナーとして割り当て、onClickをメンバー関数として実装します。

22
henningj

たとえば3つのボタンがあるとします

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(mCorkyListener);
        button2.setOnClickListener(mCorkyListener);
        button3.setOnClickListener(mCorkyListener);

    }

    // Create an anonymous implementation of OnClickListener
    private View.OnClickListener mCorkyListener = new View.OnClickListener() {
        public void onClick(View v) {
            // do something when the button is clicked 
            // Yes we will handle click here but which button clicked??? We don't know

        }
    };

}

それでは、私たちは何をしますか?

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(mCorkyListener);
        button2.setOnClickListener(mCorkyListener);
        button3.setOnClickListener(mCorkyListener);

    }

    // Create an anonymous implementation of OnClickListener
    private View.OnClickListener mCorkyListener = new View.OnClickListener() {
        public void onClick(View v) {
            // do something when the button is clicked
            // Yes we will handle click here but which button clicked??? We don't know

            // So we will make
            switch (v.getId() /*to get clicked view id**/) {
                case R.id.corky:

                    // do something when the corky is clicked

                    break;
                case R.id.corky2:

                    // do something when the corky2 is clicked

                    break;
                case R.id.corky3:

                    // do something when the corky3 is clicked

                    break;
                default:
                    break;
            }
        }
    };

}

または、これを行うことができます。

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky is clicked
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky2 is clicked
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something when the corky3 is clicked
            }
        });

    }

}

または、View.OnClickListenerを実装できます。これが最良の方法だと思います。

public class MainActivity extends ActionBarActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        // Capture our button from layout
        Button button = (Button)findViewById(R.id.corky);
        Button button2 = (Button)findViewById(R.id.corky2);
        Button button3 = (Button)findViewById(R.id.corky3);
        // Register the onClick listener with the implementation above
        button.setOnClickListener(this);
        button2.setOnClickListener(this);
        button3.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        // do something when the button is clicked
        // Yes we will handle click here but which button clicked??? We don't know

        // So we will make
        switch (v.getId() /*to get clicked view id**/) {
            case R.id.corky:

                // do something when the corky is clicked

                break;
            case R.id.corky2:

                // do something when the corky2 is clicked

                break;
            case R.id.corky3:

                // do something when the corky3 is clicked

                break;
            default:
                break;
        }
    }
}

最後に、実際の違いはありませんJust "Way better than the other"

54
Ibrahim Disouki

簡単にするために、最初のコードスニペットのみを参照していることに注意してください。

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

protected void onCreate(Bundle savedValues) {
    ...
    // Capture our button from layout
    Button button = (Button)findViewById(R.id.corky);
    // Register the onClick listener with the implementation above
    button.setOnClickListener(mCorkyListener);
    ...
}

setOnClickListener(View.OnClickListener l)は、Viewクラスのパブリックメソッドです。 ButtonクラスはViewクラスを拡張するため、setOnClickListener(View.OnClickListener l)メソッドを呼び出すことができます。

setOnClickListenerは、ビュー(この場合はボタン)がクリックされたときに呼び出されるコールバックを登録します。この回答は、最初の2つの質問に答えるはずです。

1。setOnClickListenerは上記の論理にどこに収まりますか?

ボタンがクリックされたときにコールバックを登録します。 (次の段落で詳細に説明します)。

2。ボタンのクリックを実際に聞いているのはどれですか?

setOnClickListenerメソッドは、ボタンのクリックを実際にリッスンするメソッドです。

呼び出されるコールバックを登録すると言うと、メソッドの入力パラメーターであるView.OnClickListener lを実行します。あなたの場合、それはbutton.setOnClickListener(mCorkyListener);で言及されたmCorkyListenerになり、次にonClick(View v)で言及されたメソッドを実行します

// Create an anonymous implementation of OnClickListener
private OnClickListener mCorkyListener = new OnClickListener() {
    public void onClick(View v) {
      // do something when the button is clicked
    }
};

さらに進んで、OnClickListenerは、ビュー(この場合はボタン)がクリックされたときに呼び出されるコールバックのインターフェイス定義です。簡単に言うと、そのボタンをクリックすると、mCorkyListener内のメソッド(OnClickListenerの実装であるため)が実行されます。ただし、OnClickListenerにはOnClick(View v)という1つのメソッドしかありません。したがって、ボタンをクリックしたときに実行する必要のあるアクションはすべて、このメソッド内でコーディングする必要があります。

setOnClickListenerOnClickListenerの意味がわかったので、2つを自分で区別できると確信しています。 3番目の用語View.OnClickListenerは、実際にはOnClickListenerそのものです。 View.の前にある唯一の理由は、プログラムの最初のimportステートメントの違いによるものです。 importステートメントとしてimport Android.view.View;のみを使用する場合は、View.OnClickListenerを使用する必要があります。これらのインポートステートメントのいずれかを言及する場合:import Android.view.View.*;またはimport Android.view.View.OnClickListener;View.をスキップして、単純にOnClickListenerを使用できます。

7
Roger Amanna

Viewはすべてのウィジェットのスーパークラスであり、OnClickListenerインターフェイスはこのクラスに属します。すべてのウィジェットはこれを継承します。 View.OnClickListenerはOnClickListenerと同じです。ボタンに必要なアクションを実現するには、このリスナーからonClick(View view)メソッドをオーバーライドする必要があります。

ウィジェットのクリックイベントをリッスンするようAndroidに指示するには、以下を行う必要があります。

widget.setOnClickListener(this); // If the containing class implements the interface
// Or you can do the following to set it for each widget individually
widget.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Do something here
    }
});

OnClick()メソッドに渡された「View」パラメーターは、ビューがクリックされたことをAndroidに通知するだけです。 Button、TextView、またはその他のいずれかです。すべてのウィジェットにOnClickListenerを設定するか、これらすべてのウィジェットを含むクラスにインターフェースを実装させるだけです。この場合、すべてのウィジェットに共通のonClick()メソッドがあり、メソッドに渡されるビューのIDを確認し、必要な各要素のIDと照合するだけです。その要素に対してアクションを実行します。

4
ucsunil
  1. まず、View.OnClickListenerOnClickListenerの間に違いはありません。 View.OnClickListenerを直接使用する場合は、書く必要はありません。

    インポートAndroid.view.View.OnClickListener

  2. OnClickListenerインスタンス(例:myListener名前付きオブジェクト)をsetOnclickListener()経由でビューのリスナーとして設定します。 clickイベントが発生すると、そのmyListenerが通知され、onClick(View view)メソッドが呼び出されます。それが私たち自身の仕事をする場所です。これがお役に立てば幸いです。

3
Amit K. Saha