Динамическое создание кнопок и настройка onClickListener - PullRequest
27 голосов
/ 09 декабря 2010

У меня проблема с обработкой динамически создаваемых кнопок на Android.Я создаю N кнопок, и я должен сделать тот же метод, когда кнопка нажата, но я должен знать, какая кнопка нажата.используя метод ниже, чтобы увидеть, какая кнопка была нажата.(строка btn.setId(2000+i); и btn.setOnClickListener((OnClickListener) this);).Этот метод также реализован в упражнении.

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

        ...

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

Это не очень хорошо для меня, поэтому я спрашиваю, есть ли лучший способ сделать это?или как отправить некоторую информацию на событие onclick?какие-либо предложения?

Ответы [ 9 ]

63 голосов
/ 16 декабря 2010

Вы можете создать метод, который возвращает onclickListener и принимает кнопку в качестве параметра.И затем используйте этот метод, чтобы установить onClicklistener в первом цикле, который у вас есть.

Обновление: код может быть таким:используйте это в цикле, как это

button.setOnClickListener(getOnClickDoSomething(button));
12 голосов
/ 22 августа 2012

У меня есть одно решение для этого .. используйте этот код в 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]));

}

после того, как onCreate создайте один метод типа возврата View.OnClickListener как этот ..

View.OnClickListener handleOnClick(final Button button) {
    return new View.OnClickListener() {
        public void onClick(View v) {
        }
    };
}
5 голосов
/ 22 июня 2012
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();  
    }

};

позвоните этому слушателю btn.setOnClickListener(btnclick);

3 голосов
/ 20 декабря 2010

Идентификаторы представлений не должны использоваться для этих целей, так как идентификаторы представлений генерируются во время компиляции в зависимости от идентификаторов, определенных в файлах макета XML.

Просто поместите ваши собственные идентификаторы в метод setTag (), который доступен на уровне просмотра (таким образом, кнопки наследуют их). Этот «тег» может быть любым, что позволяет вам распознавать вид от других. Вы получаете его значение с помощью getTag ().

1 голос
/ 22 ноября 2015

вместо этого используйте функцию setTag (), чтобы легко различать.

 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");
             }
         }
     }
0 голосов
/ 19 марта 2016
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");
}
}
0 голосов
/ 22 сентября 2013

Желательно не портить идентификаторы, для этого были разработаны методы setTag и getTag, это быстрый и чистый способ установить группу слушателей кнопок на динамическом макете

Этот ответ может вам помочь: https://stackoverflow.com/a/5291891/2804001

0 голосов
/ 20 декабря 2010

Я не знаю, почему вы захотите создать N кнопок, похоже, что ваше значение N больше 10, по крайней мере, если вы не пытаетесь показать их все сразу (я имею в виду, чтобы все они помещались в один экран, без прокрутки) вы можете попытаться утилизировать невидимые кнопки так же, как мы делаем для просмотра списка, используя держатель списка. Это уменьшит объем используемой памяти и повысит производительность, а также выделит кнопки по тексту, который вы на них наделили, или по тегу, или вы даже можете сохранить ссылку на это небольшое количество кнопок.

0 голосов
/ 14 декабря 2010

«Мне это не нравится», почему бы и нет? это не работает? Вы также можете создать статическую переменную-член, содержащую список всех добавленных кнопок, и вместо этого искать нажатую кнопку в этом списке.

...