studio setonclicklistener event android button android-widget android-layout

setonclicklistener - set onclick button android



Creación dinámica de botones y configuración enClickListener (9)

Tengo un problema con el manejo de botones creados dinámicamente en Android. Estoy creando N botones y tengo que hacer el mismo método cuando se hace clic en el botón, pero tengo que saber en qué botón se hace clic.

for (int i = 0; i < NO_BUTTONS; i++){ Button btn = new Button(this); btn.setId(2000+i); ... btn.setOnClickListener((OnClickListener) this); buttonList.addView(btn); list.add(btn);

Actualmente estoy agregando ID a cada botón y estoy usando el método a continuación para ver en qué botón se hizo clic. (línea btn.setId(2000+i); y btn.setOnClickListener((OnClickListener) this); ). Este método también se implementa en la actividad.

@Override public void onClick(View v) { switch (v.getId()){ case 2000: selectButton(0); break; ... case 2007: selectButton(7); break; } }

Esto no se ve bien para mí, así que estoy preguntando ¿hay alguna forma mejor de hacer esto? o cómo enviar información al evento onclick? ¿alguna sugerencia?


"Esto no me parece bien" ¿por qué no? no funciona? También podría crear una variable de miembro estática que contenga una lista de todos los botones agregados, y luego buscar el botón en cuestión en esa lista.


Es preferible no estropear los ids, los métodos setTag y getTag fueron diseñados para ese propósito, es la forma rápida y limpia de configurar un grupo de oyentes de botones en un diseño dinámico

Esta respuesta puede ayudar: https://.com/a/5291891/2804001


Los identificadores de vista no se deben usar para estos fines ya que los Ids de visualización se generan en tiempo de compilación según los ID definidos en los archivos de diseño xml.

Simplemente coloque sus propios ID en el método setTag () que está disponible en el nivel de Vista (para que los Botones los hereden). Esta "etiqueta" puede ser cualquier cosa que le permita reconocer una Vista de los demás. Recuperas su valor con getTag ().


No sé por qué querrías crear N botones, parece que tu valor de N es mayor que 10 al menos, si no estás tratando de mostrarlos todos a la vez (quiero decir encajarlos todos en una sola pantalla) , sin desplazamiento) podría tratar de reciclar los botones invisibles tal como lo hacemos para la vista de lista usando un titular de vista de lista. Esto reduciría la huella de la memoria y aumentaría el rendimiento, y diferenciaría los botones en función del texto que establezca en ellos o una etiqueta, o incluso puede mantener una referencia a esa pequeña cantidad de botones.


Puede crear un método que devuelva onclickListener y tome un botón como parámetro. Y luego usa ese método para configurar el onClicklistener en el primer ciclo que tienes ...

Actualización: el código podría ser todo lo siguiente:

View.OnClickListener getOnClickDoSomething(final Button button) { return new View.OnClickListener() { public void onClick(View v) { button.setText("text now set.. "); } }; }

como un método en la actividad y luego usarlo en el ciclo como este

button.setOnClickListener(getOnClickDoSomething(button));


Tengo una solución para esto ... use este código en onCreate

linear = (LinearLayout) findViewById(R.id.linear); LayoutParams param = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1.0f); Button[] btn = new Button[num_array_name.length]; for (int i = 0; i < num_array_name.length; i++) { btn[i] = new Button(getApplicationContext()); btn[i].setText(num_array_name[i].toString()); btn[i].setTextColor(Color.parseColor("#000000")); btn[i].setTextSize(20); btn[i].setHeight(100); btn[i].setLayoutParams(param); btn[i].setPadding(15, 5, 15, 5); linear.addView(btn[i]); btn[i].setOnClickListener(handleOnClick(btn[i])); }

después de onCreate, crea un método de retorno tipo View.OnClickListener como este ..

View.OnClickListener handleOnClick(final Button button) { return new View.OnClickListener() { public void onClick(View v) { } }; }


en su lugar use la función setTag () para distinguir fácilmente.

for(int i=0;i<4;i++) { Button btn = new Button(this); btn.setTag(i); btn.setOnClickListener(new View.OnclickListener() { @Override public void onClick(View v) { int i=v.getTag(); switch(i) { case 1: btn.setText(i); break; case 2: btn.setText(i); break; case 3: btn.setText(i); break; case 4: btn.setText(i); break; default: btn.setText("Others"); } } }


Button.OnClickListener btnclick = new Button.OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub Button button = (Button)v; Toast.makeText(getApplicationContext(), button.getText().toString(),2).show(); } };

llama a este oyente por btn.setOnClickListener(btnclick);


public class MainActivity extends Activity implements View.OnClickListener { LinearLayout linearLayout; Button [] button; View.OnClickListener listener; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); linearLayout=(LinearLayout)findViewById(R.id.parent_lay); String[] array={"U123","U124","U125"}; int length=array.length; System.out.println("11111111111111111111111111"); button=new Button[length]; for(int i=0;i<length;i++) { button[i]=new Button(getApplicationContext()); button[i].setId(i); button[i].setText("User" + i); button[i].setOnClickListener(this); linearLayout.addView(button[i]); } } @Override public void onClick(View view) { view.getId(); Button button=(Button)findViewById(view.getId()); button.setText("Changed"); } }