Domanda

Ho problemi con la gestione di pulsanti creati dinamicamente su Android. Sto creando pulsanti N e devo fare lo stesso metodo quando viene cliccato il pulsante, ma devo sapere quale pulsante viene premuto.

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);

Cucurrently Sto aggiungendo ID per ogni bottone e sto usando il metodo seguito per vedere quale pulsante è stato premuto. (Linea di btn.setId(2000+i); e btn.setOnClickListener((OnClickListener) this);). Questo metodo è implementato anche nell'attività.

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

        ...

        case 2007: selectButton(7);
        break;
    }
 }

Questo non sembra buono per me in modo che io sto chiedendo c'è qualche modo migliore per fare questo? o il modo di inviare alcune informazioni di evento onclick? qualche suggerimento?

È stato utile?

Soluzione

Si potrebbe creare un metodo che restituisce un onclickListener e prende un pulsante come parametro. E quindi utilizzare tale metodo per impostare l'onClicklistener nel primo ciclo si ha ..

Aggiornamento: codice potrebbe essere soemthing lungo queste linee:

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

come metodo nell'attività e quindi utilizzare nel ciclo come questo

button.setOnClickListener(getOnClickDoSomething(button));

Altri suggerimenti

Ho una soluzione per questo .. utilizzare questo codice in 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]));

}

dopo onCreate creare un metodo di tipo di ritorno View.OnClickListener come questo ..

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();  
    }

};

Chiamare questo listener da btn.setOnClickListener(btnclick);

Visualizza gli ID non deve essere utilizzato per questi scopi, come Vista Ids sono generati in tempo di compilazione a seconda ID definiti nel file di layout XML.

Basta posizionare il proprio ID nel metodo setTag (), che è disponibile a livello di vista (così Bottoni loro ereditare). Questa "tag" può essere qualsiasi cosa che ti permettono di riconoscere una vista da altri. Si recupera il suo valore con GetTag ().

utilizzare invece funzione setTag () per distinti facilmente.

 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");
             }
         }
     }

"Questo non sta bene a me" perché no? Non funziona? Si potrebbe anche creare una variabile membro statica in possesso di un elenco di tutti i pulsanti aggiunti, e quindi cercare il pulsante cliccato in tale elenco, invece.

Non so perché si vuole creare pulsanti N, sembra che il tuo valore di N è maggiore di 10, almeno, se non si sta cercando a tutti loro mostrare in una sola volta (intendo andare bene tutti in una singola schermata, senza scorrimento) si potrebbe provare a riciclare i pulsanti invisibili, proprio come facciamo per la visualizzazione elenco utilizzando un supporto visualizzazione elenco. Ciò ridurrebbe le emissioni di anidride memoria e migliorare le prestazioni, e differenziare i pulsanti basati sia sul testo si imposta su di loro o un tag o si può anche contenere un riferimento a quelle piccolo numero di pulsanti.

È preferibile non pasticciare con gli ID, i metodi e setTag GetTag sono stati progettati per questo scopo, è il veloce e modo pulito per impostare un gruppo di ascoltatori dei pulsanti su una dinamica di layout

Questa risposta può aiutare: 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");
}
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top