2010-12-09 6 views
25

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

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? какие-либо предложения?

ответ

59

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

Обновление: код может быть soemthing вдоль этих линий:

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

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

button.setOnClickListener(getOnClickDoSomething(button)); 
+0

и код будет выглядеть ..... – Ante 2010-12-19 11:19:34

+0

да, это хорошо, если вы разрабатываете рабочий стол приложение. Но мы говорим о мобильном устройстве, которое меньше памяти. Таким образом, вместо использования только одного OnClickListener вы создаете 8 из них. это много. Несмотря на то, что это уродливо, я бы предпочел первый подход и попытался сделать выбор в цикле, чтобы сделать лучше. – 2010-12-20 16:55:51

+0

@Omer Вы уверены, что Android не оптимизирует это самостоятельно при компиляции? – blindstuff 2010-12-20 19:59:29

0

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

+0

я думаю, что это нарушает некоторый принцип или что-то .. я не люблю заявления переключатель .. я хотел бы, пока я добавлять OnClickListener передать некоторые данные/переменной, так что я могу знать, какие позже кнопка был щелкнут .. возможно? – Ante 2010-12-14 00:44:09

+0

@Ante B .: ok, вы можете сделать что-то подобное по методу onClick: selectButton (v.getId() - 2000); – fabio 2010-12-14 18:10:44

+0

или вы также можете создать статическую переменную с именем SelectedBtn, а затем в методе onClick сделать что-то вроде: SelectedBtn = v; таким образом, вы можете ссылаться на ту кнопку, которая была нажата в других частях вашего приложения, - обратите внимание, что таким образом можно было бы даже не допустить, чтобы nesty Id нажал на ваши кнопки. Но я не совсем понимаю, что вы пытаетесь сделать вообще, поэтому я просто даю снимки здесь ... – fabio 2010-12-14 18:16:07

3

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

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

0

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

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

12

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

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

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

0

вместо этого использовать функцию 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
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"); 
} 
} 
Смежные вопросы