PDA

Ver la Versión Completa : [ CONSULTA ] Dudas de novato


Kitinz
03/09/10, 14:53:58
Buenas a todos.

Como otros tantos estoy iniciandome en la programación en Android ya que voy a desarrollar un pequeño proyecto para esta plataforma.

He estado unos días leyendo algo de documentación y ahora estoy siguiendo un par de tutoriales para empezar a coger algo de soltura. El caso es que he creado dos botones, uno para sumar y el otro para restar, para eso he hecho lo siguiente:

action = (Button) findViewById(R.id.btSuma);
action.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//Código para hacer la suma
}
});


action = (Button) findViewById(R.id.btResta);
action.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//Código para hacer la resta
}
});Y mi pregunta es: ¿Esta es la forma correcta de asignarle la funcionalidad al botón? ¿Poniendo el Listener justo debajo del findViewById? Porque en el Listener no veo forma de distinguir un botón de otro...



Por cierto, otra cosa de la que no estoy seguro:

El formato del código que os he puesto es el que venía en el tutorial, pero se me hace raro que en los argumentos del setOnClickListener() se ponga la función View.onClickListener con su código de ejecución incluido en vez de tenerla definida fuera y simplemente hacer la llamada:

action.setOnClickListener(new View.OnClickListener());Aunque acabo de darme cuenta que dentro lleva otra funcion, public void onClick(), así que ya no se si estoy diciendo algo con sentido o sin el xD.



En fin, a ver si alguien me puede ayudar a solventar estas dudas existenciales :)
Gracias!

pmaicas
03/09/10, 17:12:25
Se puede hacer de varias formas, y esta es una de ellas.

Aqui creas (el compilador lo hace por ti) dos clases diferentes y en ambas implementas onclicklistener, el código de ambas es diferente, no necesitas distinguir uno de otro (aunque podrías).

Tambien puede implemntar onclicklistener en una sola clase, típicamente la misma activity, y entonces asignas setonclicklistener(this) a ambos botones. Implementas onClick(View v) y entonces el código es común a ambos botones. Necesitas pues diferenciar el bton puldado, que puedes hacer con un switch(v.getId()) { case R.id.Boton1: ....

Otra opcion más facil todavía, a partir de la version 1.6 del sdk, asigna un nombre de funcion en el layout, al definir el boton, hay una propiedad onclick. Puedes asignar el mismo nombre de funcion o diferente a ambos botones, y no necesitas extender onclicklistener ni nada, una simple funcion con un nombre cuaquiera vale (pero que sea public y con un parámetro View)

Espero no haberte liado más.

Kitinz
04/09/10, 16:18:23
Mmm, voy a ir por partes a ver si te he entendido bien :)


Se puede hacer de varias formas, y esta es una de ellas.

Aqui creas (el compilador lo hace por ti) dos clases diferentes y en ambas implementas onclicklistener, el código de ambas es diferente, no necesitas distinguir uno de otro (aunque podrías).


Este caso es el que he implementado yo y que pongo de ejemplo en el primer post, verdad?




Tambien puede implemntar onclicklistener en una sola clase, típicamente la misma activity, y entonces asignas setonclicklistener(this) a ambos botones. Implementas onClick(View v) y entonces el código es común a ambos botones. Necesitas pues diferenciar el bton puldado, que puedes hacer con un switch(v.getId()) { case R.id.Boton1: ....


Esta implementación creo que me interesa, pues me evitaría duplicar funciones. Ahora tengo solo 2 botones, pero si se implementan más, imagino que es más eficiente y mejor tener solo un onClickListener que maneje todos los botones de la misma pantalla.

Según lo que dices, el código tendría que quedar así (le añado más botones porque sería lo mismo, verdad?):

action = (Button) findViewById(R.id.btSuma);
action = (Button) findViewById(R.id.btResta);
action = (Button) findViewById(R.id.btMult);
action = (Button) findViewById(R.id.btDiv);

action.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
switch(v.getId()){
case R.id.btSuma: {//Codigo para sumar}
case R.id.btResta: {//Codigo para restar}
case R.id.btMult: {//Codigo para multiplicar}
case R.id.btDiv: {//Codigo para dividir}
}
}
});



Otra opcion más facil todavía, a partir de la version 1.6 del sdk, asigna un nombre de funcion en el layout, al definir el boton, hay una propiedad onclick. Puedes asignar el mismo nombre de funcion o diferente a ambos botones, y no necesitas extender onclicklistener ni nada, una simple funcion con un nombre cuaquiera vale (pero que sea public y con un parámetro View)


Cuando dices que le asigne la funcion en el layout te refieres en el main.xml? Y la función que le asigne a la propiedad onclick la implemento en el .java?




Espero no haberte liado más.


No, no me has liado. Entiendo que hay varias maneras de hacer lo mismo, aunque me gustaria saber cual es la manera "correcta" de hacerlo. Es decir, si existen reglas de estilo o que forma es la más extendida (Dando por supuesto que la más extendida sea la "mas sencilla" xD)

En fin, que muchas gracias por contestar, aunque no he tardado en volver a dar la lata :)