2010-09-25 21 views
46

tôi thấy mình làm những việc như thế này tất cả các thời gian:Một OnClickHandler cho nhiều Buttons

Button button1 = (Button) findViewById(R.id.button1); 
    Button button2 = (Button) findViewById(R.id.button2); 
    Button button3 = (Button) findViewById(R.id.button3); 

    button1.setOnClickListener(menuButtonListener); 
    button2.setOnClickListener(menuButtonListener); 
    button3.setOnClickListener(menuButtonListener); 
... 

private OnClickListener myButtonListener = new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     switch(v.getId()){ 
     case R.id.button1 : 
    ... 

Có cách nào tốt hơn để thiết lập các OnClickListener?

Trả lời

59

Bạn cũng có thể đặt nó trong bố cục xml bằng cách sử dụng thuộc tính android: onclick.

android:onClick="onClick" 

Sau đó, trong lớp hoạt động của bạn, hãy thêm phương thức onClick.

public void onClick(View v) { 
... 

Đây là documentation.

+0

Ah, đẹp :) Ngắn và hiệu quả. Tôi thích nó! – mseo

+1

Điều gì xảy ra nếu các nút được tạo động? – Orion

+1

@Orion Cả cách tiếp cận này và cách tiếp cận của mseo cũng sẽ hoạt động với các nút được tạo động. – Tiago

35

Có lớp học của bạn thực hiện 'View.OnClickListener', như

public class MyActivity extends Activity implements View.OnClickListener { 

    Button button1, button2, button3; 

    @Override 
    public void onCreate(Bundle bundle) { 
     super.onCreate(); 

     ... 

     button1 = (Button) findViewById(R.id.button1); 
     button2 = (Button) findViewById(R.id.button2); 
     button3 = (Button) findViewById(R.id.button3); 

     button1.setOnClickListener(this); 
     button2.setOnClickListener(this); 
     button3.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
      case R.id.button1: 
      // do stuff; 
      break; 
      case R.id.button2: 
      // do stuff; 
      break; 
     ... 
    } 
} 
+1

Chà ... không giúp tôi tiết kiệm được nhiều công sức. Đó là một khả năng khác để làm điều đó, nhưng nó không thực sự ngắn hơn hoặc thanh lịch hơn cách tiếp cận của tôi. – mseo

+0

Điều này dường như hoạt động tốt cho Hoạt động mở rộng Fragments – CelticParser

+0

đã thích! Làm thế nào để làm việc này mặc dù ...? –

4

Cần lưu ý, rằng

android:onclick="onClick" 

đòi hỏi ít nhất Andoid SDK 1.6. Vì vậy, nếu bạn muốn ứng dụng của mình có thể truy cập được với lượng khán giả lớn nhất có thể, bạn có thể muốn viết Ứng dụng của mình với Android 1.6. Trừ khi ứng dụng của bạn yêu cầu tính năng chỉ khả dụng trong phiên bản 1.6 trở lên. Vì vậy, trong khi nỗ lực đầu tiên của bạn có nhiều công việc hơn, nó có khả năng tương thích ngược lớn hơn. Tôi thường làm theo cách bạn làm, để giữ cho ứng dụng của tôi 1,5 trở nên phổ biến.

Chỉnh sửa: Thật dễ dàng để bỏ qua điều này, nếu bạn thiết lập Android 2.2 làm SDK trong cài đặt dự án của bạn, nhưng đặt phiên bản minSDK thành 3 (1.5), vì nó không cung cấp lỗi trình biên dịch.

1

Tôi nghĩ rằng trong trường hợp, khi các nút của bạn đang không ở trong Hoạt động nhưng trong FragmentDialog, vv, điều này có thể giúp

Context mContext = getActivity().getBaseContext(); 
mRes = mContext.getResources(); 
String[] idOfButtons = { "button1", "button2", "button3"}; 
for (int pos = 0; pos < idOfButtons.length; pos++) { 
    Integer btnId = mRes.getIdentifier(idOfButtons[pos], "id",(getActivity()).getBaseContext().getPackageName()); 
    ImageButton ib = (ImageButton) v.findViewById(btnId); 
    ib.setOnClickListener(this.onClickNum); 
} 
5

Gettin @foenix câu trả lời, bạn chỉ có thể làm điều gì đó như:

int[] buttons = {R.id.button1, R.id.button2, R.id.button3, R.id.button4, R.id.button5, R.id.button6, R.id.button7 
      , R.id.button8, R.id.button9}; 
    for (int i = 0; i < buttons.length; i++) { 
     Button buttonNum = (Button) rootView.findViewById(buttons[i]); 
     buttonNum.setOnClickListener(doSomething); 
    } 

private OnClickListener doSomething= new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
      //doSomething 
    } 
}; 
0

Nếu bạn muốn làm ít mã cho người nghe nhấp chuột bạn có lib này [http://jakewharton.github.io/butterknife/]

bạn chỉ phải làm

này
@OnClick({ R.id.button1, R.id.button2, R.id.button3 }) 
public void doSomething(View button) { 
    //do whatever you want 
    button.changeWhateverInTheView(); 
} 
Các vấn đề liên quan