Динамическое создание кнопок и установка onClickListener

У меня проблема с обработкой динамически созданных кнопок на Android. Я создаю кнопки N, и я должен сделать тот же метод, когда нажимается кнопка, но я должен знать, какая кнопка нажата.

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 Я добавляю ID для каждой кнопки, и я использую метод ниже, чтобы увидеть, какая кнопка была нажата. (Строка 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? какие-либо предложения?

Solutions Collecting From Web of "Динамическое создание кнопок и установка onClickListener"

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

Обновление: код может быть следующим:

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

Как метод в активности, а затем использовать его в цикле, как это

 button.setOnClickListener(getOnClickDoSomething(button)); 

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

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

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

 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); этого слушателя btn.setOnClickListener(btnclick);

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

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

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

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

Вместо этого используйте функцию 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"); } } } 
 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"); } }