Pregunta

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 siguiente 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 me parece bien, así que pregunto: ¿hay alguna forma mejor de hacerlo?¿O cómo enviar alguna información al evento onclick?¿alguna sugerencia?

¿Fue útil?

Solución

Se podría crear un método que devuelve un OnClickListener y toma un botón como parámetro. Y luego usar ese método para establecer el OnClickListener en el primer bucle que tiene ..

Actualización: código podría ser soemthing lo largo de estas líneas:

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 bucle como este

button.setOnClickListener(getOnClickDoSomething(button));

Otros consejos

Tengo una solución para esto .. utilizar 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 onCreate crear un método de tipo de retorno View.OnClickListener como esto ..

View.OnClickListener handleOnClick(final Button button) {
    return new View.OnClickListener() {
        public void onClick(View v) {
        }
    };
}
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();  
    }

};

llamada a este detector por btn.setOnClickListener(btnclick);

Ver identificaciones no se debe utilizar para estos fines que ver identificadores son generados en tiempo de compilación en función de los ID definidos en archivos de formato XML.

Sólo tiene que colocar sus propios identificadores en el método setTag () que está disponible en el nivel de vista (por lo Botones heredar). Esta "etiqueta" puede ser cualquier cosa que le permiten reconocer una vista de los demás. Que recupere su valor con getTag ().

en lugar de utilizar la función setTag () para distinta 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");
             }
         }
     }

"Esto no se ve bien para mí" ¿por qué no? Por qué no funciona? También puede crear una variable miembro estática que sostiene una lista de todos los botones añadidos, y luego buscar el botón hecho clic en esa lista en su lugar.

No sé por qué querrías crear N botones, parece que tu valor de N es mayor que 10 al menos, si no intentas mostrarlos todos a la vez (me refiero a colocarlos todos en una sola pantalla). , sin desplazamiento) puede intentar reciclar los botones invisibles tal como lo hacemos para la vista de lista usando un soporte de vista de lista.Esto reduciría el consumo de memoria y mejoraría el rendimiento, y diferenciaría los botones según el texto que haya configurado en ellos o una etiqueta, o incluso puede mantener una referencia a esa pequeña cantidad de botones.

Es preferible que no se meta con los identificadores, métodos y setTag GetTag fueron diseñados para ese propósito, es el rápido y de forma limpia para establecer un grupo de oyentes de botón en un dinámico diseño

Esta respuesta puede ayudarle: https://stackoverflow.com/a/5291891/2804001

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");
}
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top