Динамическое создание кнопок и установка 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);
В последнее время я добавляю идентификатор каждой кнопки, и я использую метод ниже, чтобы увидеть, какая кнопка была нажата. (строка 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? любые предложения?
Ответы
Ответ 1
Вы можете создать метод, который возвращает 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));
Ответ 2
У меня есть одно решение для этого.
используйте этот код в 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) {
}
};
}
Ответ 3
Идентификаторы просмотра не должны использоваться для этих целей, поскольку идентификаторы представления генерируются во время компиляции в зависимости от идентификаторов, определенных в файлах макета xml.
Просто разместите свои собственные идентификаторы в методе setTag(), который доступен на уровне представления (так что кнопки наследуют их). Этот "тег" может быть тем, что позволяет вам распознавать представление от других. Вы получаете его значение с помощью getTag().
Ответ 4
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);
Ответ 5
"Это не выглядит хорошо для меня", почему бы и нет? это не работает? Вы также можете создать статическую переменную-член, содержащую список всех добавленных кнопок, а затем искать нажатую кнопку в этом списке.
Ответ 6
Я не знаю, почему вы хотите создать кнопки N, похоже, что ваше значение N больше, чем 10, если вы не пытаетесь показать их все сразу (я имею в виду, что все они вставляются в на одном экране, без прокрутки), вы можете попробовать переработать невидимые кнопки, как и для просмотра списка, используя держатель списка. Это уменьшит объем памяти и повысит производительность, а также позволит дифференцировать кнопки, основанные либо на тексте, который вы устанавливаете на них, либо на теге, либо вы можете даже ссылаться на небольшое количество кнопок.
Ответ 7
Предпочтительно, чтобы не испортить идентификаторы, методы SetTag и getTag были разработаны для этой цели, это быстрый и чистый способ установить кучу кнопок-слушателей в динамическом макете
Этот ответ может помочь:
fooobar.com/questions/19596/...
Ответ 8
вместо этого используйте функцию 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");
}
}
}
Ответ 9
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");
}
}