2013-07-28 3 views
1

я добавил некоторые кнопки в макете:получить OnClick() из программно добавленных кнопок?

LinearLayout row = (LinearLayout)findViewById(R.id.KeysList); 
    keys=db.getKeys(console); 

    my_button=new Button[keys.size()]; 
    for (bt=0;bt<keys.size();bt++){ 
      my_button[bt]=new Button(this); 
      my_button[bt].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.FILL_PARENT)); 
      my_button[bt].setText(keys.get(bt)); 
      my_button[bt].setId(bt); 
      row.addView(my_button[bt]); 
      my_button[bt].setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (my_button[bt].getId() == ((Button) v).getId()){ 
         Toast.makeText(getBaseContext(), keys.get(bt), 0).show(); 
        } 
       } 
      }); 
     } 


Я хочу знать, какая кнопка нажата, и как получить текст кнопки щелкнутой?
И я думаю, что использование bt здесь не похоже на работу!

ответ

5

Этот код запущен. Я надеюсь, что это поможет вам :)

final ArrayList<String> Keys = new ArrayList<String>(); 
    for(int i = 0; i < 10; i ++){ 
     Keys.add("Keys is : " + String.valueOf(i)); 
    } 

    LinearLayout Row = (LinearLayout)findViewById(R.id.KeysList); 

    final Button[] my_button = new Button[Keys.size()]; 

    for (int bt = 0; bt < Keys.size(); bt ++){ 
     final int Index = bt; 

     my_button[Index] = new Button(this); 
     my_button[Index].setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT)); 
     my_button[Index].setText(Keys.get(Index)); 
     my_button[Index].setId(Index); 

     my_button[bt].setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (my_button[Index].getId() == ((Button) v).getId()){ 
        Toast.makeText(getBaseContext(), Keys.get(Index), 0).show(); 
       } 
      } 
     }); 

     Row.addView(my_button[Index]); 
    } 

ExampleProject ID: Your project

+0

Работает! Ключ: final int Index = bt; – joan16v

1

Возможно, вы должны использовать View#setTag для установки некоторых произвольных данных, которые вы хотите связать с кнопкой. Затем вы можете просто создать экземпляр только одного OnClickListener, который затем использует getTag и действует на эти данные любым способом.

+0

Спасибо! Этот отличный ответ должен быть отмечен как решение, потому что он намного чище и читабельен. –

0

Другим способом является то, что ваше действие прослушивает все нажатия кнопок, а затем вы просто фильтруете соответствующий идентификатор. Вы не должны получать текст кнопки и использовать ее вообще. Вы должны использовать свой собственный идентификатор, в идеале этого должно быть достаточно. Или, возможно, вы используете setTag, как описано в @qberticus.

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

Это прекрасно работает :)

+0

уже исправил это, но спасибо в любом случае – lvle