studio has event android onclicklistener

has - Android: setOnClickListener vs OnClickListener vs View.OnClickListener



onclicklistener kotlin (5)

  1. En primer lugar, no hay diferencia entre View.OnClickListener y OnClickListener . Si solo usa View.OnClickListener directamente, entonces no necesita escribir-

    importar android.view.View.OnClickListener

  2. Establece una instancia de OnClickListener (p myListener Ej., myListener llamado myListener ) como el oyente de una vista a través de setOnclickListener() . Cuando se myListener un evento de click , se notifica a myListener y se llama al método onClick(View view) . Ahí es donde hacemos nuestra propia tarea. Espero que esto te ayude.

Entiendo que cuando estoy creando un objeto de botón que escucha un clic, tengo que:

  1. Crea el objeto del botón
  2. Use OnClickListner para que escuche el clic del usuario
  3. Use onClick para ejecutar acciones después de que el usuario haga clic en el botón

Ahora,

  • ¿Dónde encaja setOnClickListener en la lógica anterior?
  • ¿Cuál escucha realmente el clic del botón?
  • setOnClickListener ?
  • OnClickListener ?
  • View.OnClickListener ?
  • ¿Cuáles son las diferencias entre esos tres?

Esto es lo que encontré en 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); ... }

También puede resultarle más conveniente implementar OnClickListener como parte de su Activity . Esto evitará la carga de clase adicional y las asignaciones de objetos. Por ejemplo:

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


Imagina que tenemos 3 botones por ejemplo

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

¿Entonces que haremos?

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

O podemos hacer esto:

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

O podemos implementar View.OnClickListener y creo que es la mejor manera:

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

Finalmente, no hay diferencias reales aquí Simplemente "Mucho mejor que el otro"


La lógica es simple. setOnClickListener pertenece al paso 2.

  1. Creas el botón
  2. Crea una instancia de OnClickListener * como se hace en ese ejemplo y anula el método onClick .
  3. Usted asigna ese OnClickListener a ese botón usando btn.setOnClickListener(myOnClickListener); en sus fragmentos / actividades en onCreate método.
  4. Cuando el usuario hace clic en el botón, se llama a la función onClick del OnClickListener asignado.

* Si import android.view.View; usa View.OnClickListener . Si import android.view.View.*; o import android.view.View.OnClickListener; usa OnClickListener hasta donde yo lo entiendo.

Otra forma es dejar que la actividad / fragmento herede de OnClickListener . De esta manera, asigna su fragmento / actividad como el oyente para su botón e implementa onClick como una función miembro.


Tenga en cuenta que, en aras de la simplicidad, he hecho referencia solo al primer fragmento de código, es decir,

// 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) es un método público de la clase View. La clase de botón amplía la clase View y, por lo tanto, puede llamar al setOnClickListener(View.OnClickListener l) .

setOnClickListener registra una devolución de llamada para ser invocada cuando se hace clic en la vista (botón en su caso). Estas respuestas deberían responder sus dos primeras preguntas:

1. ¿Dónde encaja setOnClickListener en la lógica anterior?

Resp. Registra una devolución de llamada cuando se hace clic en el botón. (Explicado en detalle en el siguiente párrafo).

2. ¿Cuál escucha realmente el clic del botón?

Resp. setOnClickListener método setOnClickListener es el que realmente escucha el clic del botón.

Cuando digo que registra una devolución de llamada para invocar, lo que quiero decir es que ejecutará View.OnClickListener l que es el parámetro de entrada para el método. En su caso, será mCorkyListener mencionado en button.setOnClickListener(mCorkyListener); que luego ejecutará el método onClick(View v) mencionado en

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

Más adelante, OnClickListener es una definición de interfaz para invocar una devolución de llamada cuando se hace clic en una vista (botón en su caso). Simplemente diciendo, cuando hace clic en ese botón, se mCorkyListener los métodos dentro de mCorkyListener (porque es una implementación de OnClickListener ). Pero, OnClickListener tiene solo un método que es OnClick(View v) . Por lo tanto, cualquier acción que deba realizarse al hacer clic en el botón debe codificarse dentro de este método.

Ahora que sabe qué significan setOnClickListener y OnClickListener , estoy seguro de que podrá diferenciar entre los dos usted mismo. El tercer término View.OnClickListener es en realidad OnClickListener . La única razón por la que tiene View. lo anterior se debe a la diferencia en el estado de import al comienzo del programa. Si solo ha import android.view.View; como la declaración de importación, tendrá que usar View.OnClickListener . Si menciona cualquiera de estas declaraciones de import android.view.View.*; : import android.view.View.*; o import android.view.View.OnClickListener; puedes saltarte la View. y simplemente use OnClickListener .


View es la superclase para todos los widgets y la interfaz OnClickListener pertenece a esta clase. Todos los widgets heredan esto. View.OnClickListener es lo mismo que OnClickListener. Tendría que anular el método onClick (Ver vista) de este oyente para lograr la acción que desea para su botón.

Para decirle a Android que escuche eventos de clic para un widget, debe hacer lo siguiente:

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

El parámetro ''Ver'' pasado en el método onClick () simplemente le permite a Android saber que se ha hecho clic en una vista. Puede ser un botón o un TextView u otra cosa. Depende de usted establecer un OnClickListener para cada widget o simplemente hacer que la clase que contiene todos estos widgets implemente la interfaz. En este caso, tendrá un método onClick () común para todos los widgets y todo lo que tiene que hacer es verificar la identificación de la vista que se pasa al método y luego compararla con la identificación de cada elemento que desee y tomar medidas para ese elemento.