Android-setOnClickListener против OnClickListener против View.OnClickListener

Я понимаю, что когда я создаю объект кнопки, который слушает щелчок, я должен:

  1. создать объект кнопка
  2. использовать OnClickListner чтобы заставить его слушать щелчок пользователя
  3. использовать onClick для выполнения действий после нажатия на кнопку

теперь

  • где setOnClickListener вписывается в приведенную выше логику?
  • который на самом деле слушает щелчок кнопки?
  • setOnClickListener?
  • OnClickListener?
  • View.OnClickListener?
  • в чем разница между этими тремя?

вот что я нашел в 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);
    ...
}

вы также можете найти его более удобным для реализации OnClickListener в рамках Activity. Это позволит избежать дополнительной нагрузки класса и распределения объектов. Например:

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
    }
}

5 ответов


логика простая. setOnClickListener принадлежит шагу 2.

  1. создать кнопку
  2. вы создаете экземпляр OnClickListener* как это сделано в этом примере и переопределить onClick-метод.
  3. вы назначить OnClickListener к этой кнопке с помощью btn.setOnClickListener(myOnClickListener); в ваших фрагментах / деятельности onCreate-метод.
  4. когда пользователь нажимает кнопку, или import android.view.View.OnClickListener; вы используете OnClickListener насколько я понимаю.

    другой способ-позволить вам активность / фрагмент наследовать от OnClickListener. Таким образом, вы назначаете свой фрагмент/действие в качестве слушателя для своей кнопки и реализуете onClick как функция-член.


представьте себе, что у нас есть 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;
        }
    }
}

наконец, нет никаких реальных различий здесь просто "лучше, чем другие"


обратите внимание, что для простоты я сделал ссылку только на первый фрагмент кода, т. е.

// 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 регистрирует обратный вызов, вызываемый при нажатии на представление (кнопка в вашем случае). Это ответы должны ответить на ваши первые два вопроса:

1. Где setOnClickListener укладывается в выше логики?

Ans. Он регистрирует обратный вызов при нажатии кнопки. (Подробно разъясняется в следующем пункте).

2. Кто на самом деле слушает щелчок кнопки?

Ans. setOnClickListener метод-это тот, который фактически слушает щелчок кнопки.

когда я говорю, что он регистрирует обратный вызов для вызова, я имею в виду, что он будет запускать View.OnClickListener l это входной параметр для метода. В вашем случае, это будет mCorkyListener упомянутые в button.setOnClickListener(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). Следовательно, любое действие, которое необходимо выполнить при нажатии кнопки, должно быть закодировано в этом методе.

теперь, когда вы знаете, что setOnClickListener и OnClickListener значит, я уверен, что вы сами сможете отличить одно от другого. Третий срок View.OnClickListener на самом деле . Единственная причина, по которой вы View.предшествующем это из-за разницы в import statment в начале программы. Если у вас есть только import android.view.View; в качестве оператора импорта вам придется использовать View.OnClickListener. Если вы упомянули любой из этих операторов import: import android.view.View.*; или import android.view.View.OnClickListener; вы можете пропустить View. и OnClickListener.


View является суперклассом для всех виджетов, и интерфейс OnClickListener принадлежит этому классу. Все виджеты наследуют это. Вид.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
    }
});

параметр "View", переданный в методе onClick (), просто позволяет Android знает, что вид был нажат. Это может быть кнопка или TextView или что-то еще. Это до вас, чтобы установить OnClickListener для каждого виджета, или просто сделать класс, содержащий все эти виджеты реализовать интерфейс. В этом случае у вас будет общий метод onClick() для всех виджетов, и все, что вам нужно сделать, это проверить идентификатор представления, которое передается в метод, а затем сопоставить его с идентификатором для каждого элемента, который вы хотите, и принять меры для этого элемент.


  1. прежде всего, нет никакой разницы между View.OnClickListener и OnClickListener. Если вы просто используете View.OnClickListener непосредственно, тогда вам не нужно писать-

    импорт android.вид.Вид.OnClickListener

  2. вы устанавливаете экземпляр OnClickListener (например,myListener именованный объект)в качестве слушателя представления через setOnclickListener(). Когда click событие, что myListener получает уведомление и onClick(View view) метод называется. Там мы выполняем свою задачу. Надеяться это тебе поможет.