2010-09-25 50 views
46

我發現自己做這樣的事情所有的時間:一個OnClickHandler多個按鈕

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 : 
    ... 

是否有更好的方法來設置OnClickListener?

回答

59

您還可以使用android:onclick屬性在您的layout xml中設置它。

android:onClick="onClick" 

然後在您的活動課中添加onClick方法。

public void onClick(View v) { 
... 

這裏是documentation

+0

啊,很好:)簡短而有效。我喜歡! – mseo 2010-09-25 20:40:00

+1

如果按鈕是動態創建的呢? – Orion 2014-03-20 23:15:00

+1

@Orion這種方法和mseo的方法也適用於動態創建的按鈕。 – Tiago 2014-09-10 22:42:02

35

讓你的類實現`View.OnClickListener」,像

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

呃...並不能爲我節省很多工作。這是另一種可能,但它並不比我的方法更短或更優雅。 – mseo 2010-09-25 20:39:09

+0

這似乎很適合活動擴展片段 – CelticParser 2012-05-31 20:57:29

+0

已經喜歡!這是如何工作的? – 2015-11-29 03:57:17

4

應當注意的是,

android:onclick="onClick" 

至少需要Andoid 1.6 SDK。因此,如果您希望您的應用能夠儘可能地被大量用戶訪問,那麼您可能需要針對Android 1.6編寫應用。除非你的應用程序需要一個只有1.6+的功能。因此,當你的第一次嘗試是更多的工作,它有更大的向後兼容性。我通常按​​照你的方式來做,以保持我的應用程序1.5可以兼容。

編輯: 如果您在項目設置中將Android 2.2設置爲SDK,但將minSDK版本設置爲3(1.5),這很容易忽略,因爲它不會給編譯器帶來錯誤。

1

我認爲,當您的按鈕在活動,但FragmentDialog等,這樣可以幫助

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

剛開@foenix回答,你可以簡單地這樣做:

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

如果你想爲聽衆點擊做更少的代碼,你有這樣的lib [http://jakewharton.github.io/butterknife/]

你就必須做到這一點

@OnClick({ R.id.button1, R.id.button2, R.id.button3 }) 
public void doSomething(View button) { 
    //do whatever you want 
    button.changeWhateverInTheView(); 
}