2012-09-24 18 views
5

he añadido algunos botones con las siguientes líneas:¿Cómo obtener OnClick() desde botones agregados mediante programación?

for (int i=0; i<XML.size(); i++) { 
//add button 
ToggleButton b = new ToggleButton(this); 
// Setting the parameters 
lefttextv.setLayoutParams(lleft); 
b.setLayoutParams(bright); 
//customize button 
    b.setOnClickListener(this); 
b.setId(id_button); 
System.out.println(id_button); 
b.setHeight(100); 
b.setWidth(200); 
// Adding to the RelativeLayout as a child 
layouth.addView(lefttextv); 
layouth.addView(b); 
    id_button++; 
    } 

Pero, ¿cómo puedo conseguir el() métodos OnClick para esos? Ya implementado View.OnClickListener con este método:

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) 
    { 
    case id_button: Log.d("Button 0","Button 0 pressed); 
     break; 
    } 
} 

Pero esto no funciona, ¿cómo consigo la identificación?

+1

¿El 'id_button' siempre 0? Si no, ¿por qué está buscando 0 en la declaración 'case'? Considera no usar constantes mágicas la próxima vez. –

+1

¿no tienes que llamar a setOnClickListener en algún momento? (también, setId no hace nada, creo) – njzk2

+0

la creación de los botones está en un for-loop y se han creado más de un botón. –

Respuesta

7

b es la vista, si su método onClick es en su clase principal sólo tiene que utilizar b.setOnClickListener(this); y dejar su actividad implementa onClickListener y ahí lo tiene. O haz la forma habitual de configurar a los oyentes de la gira.

La identificación se utiliza para la referencia xml, el objeto se crea y su uso de esta identificación para referencia, en su caso creó la vista b con todas las propiedades de un ToggleButton. Es la vista.

En cambio si se utiliza v.getId() sólo tiene que utilizar if(v == b)

+0

OK, pero utilizo un bucle for y creo más botones y no sé cómo verificar los diferentes ID en mi declaración de cambio/caso ... cambiar (v.getId()) {case R.id.id_button: \t Log.d ("ONCLICK", "Botón gedrückt");} no es posible porque establecí el ID con esta línea b.setId (id_button); –

+0

Agregue las vistas a una ArrayList ... use un grupo de vista para revisarlas y comprobar cuál es su id. – FabianCook

+0

Y en ese caso, si id_button es un número creciente que representa cada botón, ¿por qué no usar Log.d ("Button" + v.getId())? – FabianCook

6

Solo use b.setOnClickListener(this), donde this se refiere a la clase que implementa OnClickListener.

Editar:

Puede utilizar los recursos de ID para identificar los botones. Consulte here para obtener más información. Puede asignar esos ID a sus vistas generadas programáticamente y verificarlas en su declaración de cambio/caso.

Alternativamente, como @SmartLemon dijo, solo puede marcar if (v == b), entonces no necesita molestarse con los ID.

+0

bien, funciona bien para un botón, pero creo más botones en un bucle for con diferentes ID. ¿Cómo puedo darme cuenta de esto? –

+0

Ah, buen punto. Ver editar. – Magicode

+0

OK, pero no sé cómo verificarlos en mi declaración de cambio/caso ... 'switch (v.getId()) {case R.id.id_button: \t Log.d ("ONCLICK", "Botón gedrückt");} 'no es posible porque he configurado la ID con esta línea' b.setId (id_button); ' –

3

has establecido id del button como id_button derecho?

añadir onCreate Método:

b1.setOnClickListener(this);  

usar que id en el método onClick de la siguiente manera:

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    if(v.getId() == R.id.id_button) 
    { 
    Log.d("Button 0","Button 0 pressed); 
     break; 
    } 
} 
+0

El archivo 'R' es un archivo generado, generado antes de la ejecución, no está utilizando R.id.id_button está usando id_button. Es solo una variable local. – FabianCook

+0

tiene que usar la identificación. Sí, sé que R es un archivo generado. Pero él puede usar R.id. no hay problema porque la identificación se almacena en R antes de que el usuario haga clic en el botón .... –

+0

Pero ya tiene la variable local ... sería una tontería hacer referencia a otro archivo para algo que ya está allí. Entonces, surge el siguiente hecho, ¿por qué usar v.getId y b.getId cuando simplemente se puede comparar v a b? – FabianCook

3

Como implementar la OnClickListener en su clase de actividad puede pasar el objeto actual utilizando esta palabra clave para registrar el detector clic para el componente.

class MyActivity extends Activity implements OnClickListener{ 
    private static final int id_button = 0; 

    public void onCreate(Bundle b){ 
     //add button 
     ToggleButton b = new ToggleButton(this); 
     // Setting the parameters 
     lefttextv.setLayoutParams(lleft); 
     b.setLayoutParams(bright); 
     //customize button 
     b.setId(id_button); 
     System.out.println(id_button); 
     b.setHeight(100); 
     b.setWidth(200); 
     // Adding to the RelativeLayout as a child 
     layouth.addView(lefttextv); 
     layouth.addView(b); 
     b.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()){ 
     case 0: Log.d("Button 0","Button 0 pressed); 
      break; 
     } 
    } 
} 
+0

v.getId()! = 0 aquí, por lo que no funciona –

2

cambio como éste ..

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 
    int i= b.getId(); 
    switch (v.getId()) 
    { 
     case i: 
      Log.d("Button 0","Button 0 pressed"); 
      break; 
    } 
} 
+0

aquí b debe declararse fuera de OnCreate() para obtener el acceso :) –

Cuestiones relacionadas