Pergunta

Eu tenho problema com a manipulação criado dinamicamente Botões no Android.Eu estou criando botões N e que eu tenho que fazer o mesmo método quando o botão é clicado, mas eu tenho que saber qual o botão é clicado.

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, eu estou adicionando o ID para cada botão e eu estou usando o método abaixo para ver qual botão foi clicado.(linha btn.setId(2000+i); e btn.setOnClickListener((OnClickListener) this);).Este método também é implementada na atividade.

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

        ...

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

Isso não parece bom para mim, então eu estou perguntando se há alguma maneira melhor de fazer isso?ou como enviar algumas informações para o evento onclick?alguma sugestão?

Foi útil?

Solução

Você pode criar um método que retorne um OnClickListener e pega um botão como um parâmetro. E depois use esse método para definir o OnClickListener no primeiro loop que você tem ..

ATUALIZAÇÃO: O código pode estar tudo nesse sentido:

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

como um método na atividade e depois use -o no loop como este

button.setOnClickListener(getOnClickDoSomething(button));

Outras dicas

Eu tenho uma solução para isso .. use este código no 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]));

}

Após o OnCreate, crie um método de retorno tipo View.OlcickListener como este ..

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

};

Chame esse ouvinte por btn.setOnClickListener(btnclick);

As Identificações de visualização não deve ser usado para esses fins, como Identificações de Visualização são gerados em tempo de compilação dependendo Identificações definidas no xml de layout de arquivos.

Basta colocar o seu próprio IDs no setTag() método que está disponível no nível do modo de Exibição (modo Botões de herdá-las).Esta "marca" pode ser qualquer coisa que permitem reconhecer uma Vista de outras pessoas.Você recuperar o seu valor com getTag().

Em vez disso, use a função de Settag () para distinto 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");
             }
         }
     }

"Isso não parece bom para mim", por que não? Não funciona? Você também pode criar uma variável de membro estático segurando uma lista de todos os botões adicionados e, em seguida, procure o botão clicado nessa lista.

Não sei por que você gostaria de criar n botões, parece que seu valor de n é maior que 10, pelo menos, se você não estiver tentando mostrá -los de uma só vez (quero dizer, encaixe todos eles em uma única tela , sem rolagem) Você pode tentar reciclar os botões invisíveis, assim como fazemos para a visualização da lista usando um titular de visualização de lista. Isso reduziria sua pegada de memória e o desempenho de aumentar e diferenciaria os botões com base no texto que você definiu neles ou em uma tag ou você pode até manter uma referência a esses pequenos botões.

É preferível não bagunçar os métodos de IDs, Settag e GetTag foram projetados para esse fim, é a maneira rápida e limpa de definir vários ouvintes de botão em um layout dinâmico

Esta resposta pode ajudar: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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top