Método Android setOnClickListener – ¿Cómo funciona?

Tengo problemas para entender este código. Me sale que findViewById obtendrá el widget del botón y luego lo findViewById . Luego, usará el botón para llamar al método setOnClickListener . Sin embargo, no sé cuál es el argumento que se pasa al setOnClickListener y nunca antes había visto código como ese. ¿Cómo es que crea un objeto nuevo pero puede crear un método propio dentro del argumento de otro método? Sería genial si alguien pudiera explicar eso. Además, ¿qué tipo de objeto está tomando el método setOnClickListener ?

 btn = (Button)findViewById(R.id.firstButton); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tv.setText(months[rand.nextInt(12)]); tv.setTextColor(Color.rgb(rand.nextInt(255)+1, rand.nextInt(255)+1, rand.nextInt(255)+1)); } }); 

Funciona así. View.OnClickListenere está definido –

 public interface OnClickListener { void onClick(View v); } 

Por lo que sabemos, no puede crear una instancia de un objeto OnClickListener , ya que no tiene un método implementado. De modo que hay dos formas de onClick : puede implementar esta interfaz que anulará el método onClick siguiente manera:

 public class MyListener implements View.OnClickListener { @Override public void onClick (View v) { // your code here; } } 

Pero es tedioso hacerlo cada vez, ya que desea configurar un oyente de clic. Para evitar esto, puede proporcionar la implementación del método in situ, como en el ejemplo que dio.

setOnClickListener toma View.OnClickListener como su parámetro.

Esta es la mejor manera de implementar Onclicklistener para muchos botones seguidos implementando View.onclicklistener.

 public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

Este es un botón en la actividad principal

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt_submit = (Button) findViewById(R.id.submit); bt_submit.setOnClickListener(this); } 

Este es un método de anulación

  @Override public void onClick(View view) { switch (view.getId()){ case R.id.submit: //action break; case R.id.secondbutton: //action break; } } 

Lo que dice el manual sobre el método setOnClickListener es:

 public void setOnClickListener (View.OnClickListener l) 

Agregado en el nivel 1 de la API Registre una callback que se invocará cuando se haga clic en esta vista. Si no se puede hacer clic en esta vista, se puede hacer clic en ella.

Parámetros

l View.OnClickListener: la callback que se ejecutará

Y normalmente debes usarlo así

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

Eche un vistazo a esta lección y cree una calculadora simple con Android Studio .