PDA

Ver la Versión Completa : [ CONSULTA ] Sobre listeners va la cosa


Duqe
07/01/11, 03:13:51
Buenas.

Estoy intentando iniciarme en Android en plan autodidacta. Y despues de echarle el ojo a algunos libros (tengo el Hello Android camino de casa desde Amazon), no me queda claro como se utilizan los action listeners. Me lo podria alguien explicar en plan para tontos, o pasarme algun link donde lo expliquen de ese modo? Es que esta tarde he estado mirandolo, en varios sitios distintos, y lo unico que he conseguido ha sido marearme. jeje

Gracias.

asturdeibiz
07/01/11, 10:59:46
Te refieres a los event listeners, supongo.

Sirven para definir el código que se ejecutará en un determinado evento(clic, clic largo, pulsación,...). En la página de desarrolladores de Android hay bastante información de como emplearlos.
http://developer.android.com/guide/topics/ui/ui-events.html

Básicamente hay que hacer dos cosas en el código para que funcionen, pongamos un botón llamado button1 que deseamos actualice cierta información cuando se pulse.

Lo primero es registrar el evento, esto es decir que para este botón cuando sea pulsado queremos que se ejecute un trozo de código concreto:

button1.setOnClickListener(button1Listener)

Ahí estamos diciendo que cuando se haga un clic normal se ejecutará button1Listener. Eso puede ir en casi cualquier parte del código pero lo mejor es ponerlo en onCreate() de la actividad. A partir del momento de registrar el evento, da = en que parte de la actividad se esté, cuando se pulse el botón se ejecutará el código especificado.

button1Listener está definido dentro de la misma clase y sería algo así:

private OnClickListener button1Listener = new OnClickListener() {
public void onClick(View v) {
//pones el codigo que necesites
}
};

Esto es para que sirve y como se implementan los event listener, espero que sea lo que preguntas. Hay más formas de implementarlo, también puedes poner el código del evento y registrarlo a la vez, pero yo creo que es más limpio dejar el código así.

Como ya he dicho para cada control hay más eventos, solo cambia el nombre del método al que llamar, por ejemplo para una pulsación larga habría que sustituir onClick por onLongClick.

Duqe
07/01/11, 14:08:09
Muchas gracias tio. Asi explicado es mucho mas facil de entender. Eso o es que ayer estaba muy espeso. xD

Si no te importa, puedo preguntarte algo mas? jeje

Esto es un ejemplo de un ejercicio que hice ayer:

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

button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
funcion_que_sea();
}
});

Es algo distinto a lo que tu pusiste. Por lo que veo, en la 2a sentencia, junto las 2 que tu me dijiste? Por que la primera lo unico que hace es asociar el boton con el del layout, no?

Gracias otra vez.

asturdeibiz
07/01/11, 16:28:24
Pues es lo mismo, solo que registras y declaras el código que se ejecutará en la misma línea.

poner en onCreate():
button1.setOnClickListener(button1Listener);
y un método fuera de onCreate() pero en la misma actividad:
private OnClickListener button1Listener = new OnClickListener() {
public void onClick(View v) {
//pones el codigo que necesites
}
};

es lo mismo que lo que has puesto tú poniendo todo el código dentro de onCreate():

button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
funcion_que_sea();
}
});

La otra línea que pones es necesaria en ambos casos(yo la omití)
Button button1 = (Button) findViewById(R.id.button1);
y sirve para poder referenciar el objeto button1, es algo así como que busca un objeto en el layout que tenga de Id=R.id.button1 y te devuelve una referencia para que tú puedas cambiar sus características. Es totalmente necesaria si vas a trabajar con un objeto pues necesitas su referencia pero que si no fueras a hacer nada con él no necesitas. Es simplemente como pedir una dirección para saber donde esta el objeto que estas modificando. Para entender más esto busca punteros en C++.

Duqe
07/01/11, 16:37:21
Perfecto. Asi da gusto preguntar.

Gacias! :ok:

Duqe
07/01/11, 16:58:53
Acabo de ver este videotutorial:

http://www.youtube.com/watch?v=iR6VGBKteu0

Y segun veo, se puede poner un atributo como el onclick, directamente en el layout. Con lo cual no hace falta implementar los listeners. Si miras el video, a partir del minuto 12:30 lo explica.

asturdeibiz
07/01/11, 17:59:10
Cierto, te ahorras el tener que registrarlo. Yo he usado hasta ahora el método que comentábamos sin tocar el xml, pero leyendo:
http://stackoverflow.com/questions/4570838/any-disadvantage-of-androidonclick-attribute-usage
http://android-developers.blogspot.com/2009/10/ui-framework-changes-in-android-16.html
parece que la gente está más a favor de hacerlo en el xml.

Duqe
07/01/11, 18:24:17
Pues parece que si. Te ahorras codigo y lo hace mas legible.

Duqe
08/01/11, 21:20:02
Por no abrir un hilo nuevo, pongo aqui un pequeño error que tengo. Es con un boton. El cual da FC cada vez que le hago click. Y no se que probar. En principio llamaba a otra activity con su intent y tal. Pero viendo que no funcionaba, probe a que modificase un EditText. Pero nada, sigo igual.

Por no copiarlo todo de nuevo, pongo el link a stackoverflow (donde tambien pregunte):

http://stackoverflow.com/questions/4635918/android-noob-problem-with-a-button

Gracias.

Duqe
09/01/11, 00:11:21
Bueno, ya me dieron la respuesta en stackoverflow. Al parecer el error estaba en que yo declaraba la variable link en la actividad main, y luego declaraba de nuevo otra vez la variable link en el onCreate.

Pd: Me sorprende la web de stackoverflow. Con la cantidad de preguntas que se realizan, y siempre hay alguien dispuesto a echarte un cable. Con gente asi da gusto preguntar.