has - Android: setOnClickListener vs OnClickListener vs View.OnClickListener
onclicklistener kotlin (5)
-
En primer lugar, no hay diferencia entre
View.OnClickListener
yOnClickListener
. Si solo usaView.OnClickListener
directamente, entonces no necesita escribir-importar android.view.View.OnClickListener
-
Establece una instancia de OnClickListener (p
myListener
Ej.,myListener
llamadomyListener
) como el oyente de una vista a través desetOnclickListener()
. Cuando semyListener
un evento declick
, se notifica amyListener
y se llama al métodoonClick(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:
- Crea el objeto del botón
-
Use
OnClickListner
para que escuche el clic del usuario -
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.
- Creas el botón
-
Crea una instancia de
OnClickListener
* como se hace en ese ejemplo y anula el métodoonClick
. -
Usted asigna ese
OnClickListener
a ese botón usandobtn.setOnClickListener(myOnClickListener);
en sus fragmentos / actividades enonCreate
método. -
Cuando el usuario hace clic en el botón, se llama a la función
onClick
delOnClickListener
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.