¿Cómo verificar qué ImageButton se presionó?

Tengo muchos botones de imagen. El usuario puede presionar cualquiera de esos botones y necesito saber qué botón se presiona. Estos botones aparecen dinámicamente, por lo que no sé cuántos serán. Para un botón de imagen, escribiría este oyente:

ImageButton ib = new ImageButton(this);
    ib.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(TravelBite.this, "test", Toast.LENGTH_SHORT).show();
        }
    });

Pero, ¿cómo hacer un oyente para todos mis botones de imágenes? ¿Puedo reconocer qué botón se presionó por su etiqueta? Al igual que la etiqueta sería ID de sqlite.

También pongo la imagen en el botón con este código:

button.setImageDrawable( testPic ); 

button es ImageButton y testPict es dibujable (imagen)

Pero cuando presiono este botón, no muestra que esté presionado si hago esto:

button.setBackgroundColor(R.color.transparent_background);

Tuve que hacer esto porque solo quiero ver la imagen de Buton que podría presionar y reconocer lo que presioné.

Gracias.

preguntado el 03 de mayo de 12 a las 14:05

4 Respuestas

    ok what you can do is that you can write a single callback function and then set it to each and every button it will allow you to handle each button with a sing function like :

    View.OnClickListener btn_listener = View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // Do whatever work you want.
                        int id = v.getid();
                        // check for id and do you task.
                    }

Arraylist<Button> btn_group = new Arraylist<Button>;
or
Arraylist<int> btn_id_group = new ArrayList<int>;

    for (int i =0; i < 10; i++) {
        Button btn = new Button(getApplicationContext());
        btn.setId(i);
        btn_id_group.add(i) or btn_group.add(btn);
        btn.SetOnClickListener(btn_listener);
    }

I think it will work for you.

Respondido el 16 de enero de 14 a las 14:01

Pero, ¿cómo reconocer qué botón se presionó? Mi botón debe mantener alguna identificación que sabría lo que necesito seleccionar de sqlite - Niño de la calle

Puede utilizado View.setTag(objeto) y View.getTag() y guárdelo en su id de sqlite. Algo como esto:

View.OnClickListener listener = View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(TravelBite.this, (String)v.getTag(), Toast.LENGTH_SHORT).show();
                //or some function that do somthing useful
                //if( ((String)v.getTag).equals("image1") ){} or anything else
            }

Y en bucle for:

String tagFromSqlite = "image1";
ImageButton ib = new ImageButton(this);
ImageButton.setTag(tagFromSqlite);
ib.setOnClickListener(listener);

contestado el 03 de mayo de 12 a las 15:05

final OnClickLisener listener = new OnClickListener() {
     public void onClick(View v){
         switch((Integer)v.getTag()){ 
         case R.id.zero:
            break;
         case R.id.one:
            break;
         case R.id.two:
            break;
         }
     }
}

//when init the Buttom
ImageButton btn = new ImageButton(Context);
btn.setTag(NUMBER);

contestado el 03 de mayo de 12 a las 14:05

Esto no funcionará, no obtengo botones de XML, necesito crearlos dinámicamente. Este id int = v.getId(); en listener me devuelve -1 - Niño de la calle

Esto funcionó btn.setid(NÚMERO); tal vez usted sabe si esto se puede utilizar para este propósito? - Niño de la calle

tendrá que asignar manualmente las ID para mantenerlas separadas; tuve que hacer algo similar (1000 fue la ID base que elegí para agregar también)

Aunque View v en el oyente se refiere al botón presionado, cuando crea botones de forma programática, las identificaciones no son únicas y me causaron problemas, por eso las configuré específicamente

View.OnClickListener btn_listener = View.OnClickListener() 
{
      @Override
      public void onClick(View v) 
      {
            //you can use v.getID() here
      }
}

for (int i =0; i < 10; i++) 
{
    Button btn = new Button(getApplicationContext());
    btn.setID( 1000 + i );
    btn.SetOnClickListener(btn_listener);
}

contestado el 03 de mayo de 12 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.