Кнопка Click Listeners в Android

Возможный дубликат:
Разница между событием OnClick () и OnClickListener?

Я полуновичок в разработке Android, и когда я впервые начал, я старался избегать использования макета xml любыми средствами, поэтому некоторые из моих предыдущих проектов связаны с кнопками, которые явно создают OnClickListener и реализуют его как анонимный внутренний класс. Такие как –

final Button button = new Button(this); button.setText("Click to change second line of text"); OnClickListener buttonListener = new View.OnClickListener() { boolean clicked = false; int numClicks = 0; @Override public void onClick(View v) { if(numClicks > 5) { button.setText("STOP IT"); } numClicks++; if(clicked == false){ clicked = true; tv2.setText("Text Changed on Button Click"); } else { clicked = false; tv2.setText("Click again"); } } }; button.setOnClickListener(buttonListener); 

Но по мере того, как я больше знаком с андроидом, я начал понимать значение xml-макетов и реализованных кнопок, подобных этому

  <Button android:id="@+id/button1" android:layout_height = "wrap_content" android:layout_width ="wrap_content" android:text = "lets do this" android:onClick = "DoIt" /> 

В макете xml, где DoIt был определен в java.

Мой вопрос в том, являются ли эти 2 метода функционально одинаковыми? Есть ли OnClickListener, определяемый компилятором где-то за кулисами? Есть ли какие-либо функции, которыми вы торгуете, используя один или другой способ?

Solutions Collecting From Web of "Кнопка Click Listeners в Android"

Это точно то же самое. android:onClick был добавлен в уровень API 4, чтобы сделать его проще, больше Javascript-веб-подобных и вытеснить все из XML. Внутренним является то, что он добавляет OnClickListener на кнопку, которая вызывает ваш метод DoIt .

Вот что использует android:onClick="DoIt" делает внутренне:

 Button button= (Button) findViewById(R.id.buttonId); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DoIt(v); } }); 

Единственное, что вы обмениваете с помощью android:onClick , как обычно, с конфигурацией XML, заключается в том, что добавлять динамический контент становится сложнее (программно вы можете добавить одного слушателя или другого в зависимости от ваших переменных). Но это легко победить, добавив ваш тест в метод DoIt .

Используя XML, вам нужно настроить прослушиватель onclick самостоятельно. Сначала, чтобы ваш класс implements OnClickListener добавьте переменную Button button1; Затем добавьте это в свой onCreate()

 button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(this); 

Когда вы реализуете OnClickListener, вам нужно добавить унаследованный метод onClick() где вы будете обрабатывать ваши клики

Несмотря на то что вы определяете андроид: onClick = «DoIt» в XML, вам нужно убедиться, что ваша активность (или контекст представления) имеет открытый метод, определенный с тем же именем, и параметр View as. Android использует ваши определения с этой реализацией в действии. В конце, реализация будет иметь тот же код, который вы написали в анонимном внутреннем классе. Итак, в простых словах вместо того, чтобы иметь аттрибут внутреннего класса и слушателя в действии, вы просто будете иметь открытый метод с кодом реализации.