2012-05-20 49 views
9

Creé dinámicamente botones a través de código en lugar de XML.
El código es la siguiente:
Implementación de OnClickListener para botones creados dinámicamente en Android

dynamicview = (LinearLayout)findViewById(R.id.llayout); 
    LinearLayout.LayoutParams lprams = new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.WRAP_CONTENT, 
      LinearLayout.LayoutParams.WRAP_CONTENT); 

    for(int i=0;i<nob;i++){ 
     Button btn = new Button(this); 
     btn.setId(i+1); 
     btn.setText("Button"+(i+1)); 
     btn.setLayoutParams(lprams); 
     dynamicview.addView(btn); 
    } 


yo no estoy encontrando una manera en la que puedo aplicar OnClickListener a cada uno de estos botones para que pueda realizar la acción en base a la referencia que consigo.
¿Alguien me puede ayudar a resolver este problema. ?
Gracias de antemano,

+0

Las respuestas proporcionadas son correctas. La vista pasada al onClickListender es el botón y se puede convertir. Botón btn = (Botón) v; Luego, se usa para acceder a la identificación que estableces. – madmik3

Respuesta

23

ver el código de abajo:

for(int i=0;i<nob;i++) { 
    Button btn = new Button(this); 
    btn.setId(i+1); 
    btn.setText("Button"+(i+1)); 
    btn.setLayoutParams(lprams); 
    final int index = i; 
    btn.setOnClickListener(new OnClickListener() { 
     void onClick(View v) { 
      Log.i("TAG", "The index is" + index); 
     } 
    }); 
    dynamicview.addView(btn); 
} 

Mi ejemplo es bastante simple, pero muestra cómo se puede obtener el índice en el botón OnClickListeber. Puede acceder a cualquier campo final en las clases declaradas anónimas (por ejemplo, OnClickListener).

+0

Me ayudó – user1276092

+0

¿Qué ocurre si quiero realizar otra acción con un botón diferente? Creo que si escribo algún código en el oyente de clic, será lo mismo PARA TODOS LOS BOTONES, ¿cómo puedo lograr una funcionalidad diferente en cada botón? –

+2

@ Dr.aNdRO Pregunta lógica con respuesta simple. Para tener una funcionalidad diferente necesita definir diferentes 'OnClickListener's. Hazlo de la manera que quieras y simplemente complétalos en un conjunto de oyentes OnClickListener []. Luego, en el para hacer 'btn.setOnClickListener (oyentes [i]);' –

5
for(int i=0;i<nob;i++){ 
     Button btn = new Button(this); 
     btn.setId(i+1); 
     btn.setText("Button"+(i+1)); 
     btn.setOnClickListener(btnclick); <<<<<<<set click 
     btn.setLayoutParams(lprams); 
     dynamicview.addView(btn); 
    } 

y añadir a listner fuera del método y cualquier clase dentro

OnClickListener btnclick = new OnClickListener() { 

     @Override 
     public void onClick(View view) { 

      switch(view.getId()){ 
       case 1: 
       //first button click 
       break; 
       //Second button click 
       case 2: 
       break; 
       case 3: 
       //third button click 
       break; 
       case 4: 
       //fourth button click 
       break; 
      . 
      . 
      . 
      default: 
       break; 
       } 

     } 
    }; 
+0

el orden en este corde es incorrecto. quieres hacer el oyente antes del ciclo. – madmik3

+1

no es una solución adecuada ya que no sabría la cantidad de botones que tengo a mano y, además, no me gustaría agregar una caja para cada botón. –

+0

@mirroredAbstraction esta es la solución más adecuada para cada clic del botón ... y si no lo hace para todo, entonces solo necesita el método onclick –

1

su lo mismo ...

for(int i=0;i<nob;i++){ 
     Button btn = new Button(this); 
     btn.setId(i+1); 
     btn.setText("Button"+(i+1)); 
     btn.setLayoutParams(lprams); 
     btn.setOnCLickListsener(new listener()); 
     dynamicview.addView(btn); 
    } 

listener implemnets OnClickListenere{ 

public void onClick(View v){ 

} 

}

1
for(int i=0;i<nob;i++){ 
     Button btn = new Button(this); 
     btn.setId(i+1); 
     btn.setText("Button"+(i+1)); 
     btn.setLayoutParams(lprams); 
     btn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       /////Do some job on button click 
      } 
     }); 
     dynamicview.addView(btn); 
    } 
1

Utilice un Button s List y añadir a crear para que List

List<Button> list = new ArrayList<Button>(); 

Ahora agregue el botón a la Lista

for(int i=0;i<nob;i++){ 
     Button btn = new Button(this); 
     btn.setId(i+1); 
     btn.setText("Button"+(i+1)); 
     btn.setLayoutParams(lprams); 
     dynamicview.addView(btn); 
     list.add(btn); 
    } 

A continuación, el uso avanzado de bucle para iterar a través de la lista y añadir clic oyente para cada botón ..

for(Button btn : list){ 
btn.setOnClickListener(this); 
} 
1

Tal vez esto sea útil para alguien que quería utilizar la variable de un contador de grupo de botones creados de forma dinámica:

He creado la matriz de contadores:

int[] squatReps; 

Desde preferencias Me he tomado la cantidad de elementos:

squatReps = new int[squatSets]; // where squatSets is taken from preferences 

Y, por último creamos los botones

for (int i = 0; i < squatSets; i++){ 
       squatReps[i] = Integer.parseInt(sharedPreferences.getString("squats_reps", "0")); 
       final Button squat_b = new Button(this.getActivity()); 
       squat_b.setId(i); 
       squat_b.setText(""); 
       squat_b.setLayoutParams(layoutParams); 
       final int index = i; 
       squat_b.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 

         squat_b.setText(Integer.toString(squatReps[index]--));  
         startTimer();         
        } 
       }); 
       panel_1.addView(squat_b); 
Cuestiones relacionadas