2011-04-13 55 views
7

我在我的佈局XML文件中有16 Button s(數字,加號,減號等)。如何去多個按鈕和OnClickListeners

我想知道如何檢查哪個按鈕被按下。

我的想法是,我會爲每個按鈕使用onClick()方法,但這種方法有點不切實際,因爲我將對這16個方法使用onClick()方法。

有沒有更優雅的方式?

+0

http://stackoverflow.com/questions/3795439/one-onclickhandler-for-multiple-buttons – Vivart 2011-04-13 08:38:45

回答

2

您不必在點擊監聽器上提及16。創建一個並將其附加到每個按鈕。 onClick()方法獲取一個View作爲參數。這個視圖是你的按鈕。只需檢查它的ID或名稱。

6

您可以使用一個您沒有定義爲匿名內部類的處理程序,但是可以使用一個單獨的類。 onClick()將獲得傳入的視圖,您可以從中選擇。

public class MyActivity implements OnClickListener { 
    public void onClick(View v) { 
     Button b = (Button)v; 
     // do what you want 
    } 

    ... 
} 

,然後在layout.xml只是把每個按鈕

<Button android:id=".." 
     android:onClick="onClick" 
4

肯定。創建一個button-ids的數組,並在循環中爲它們指定相同的偵聽器(實現View.OnClickListener--定義爲單獨的類,而不是匿名類)。在聽衆中,您可以檢查哪個是按下的按鈕(通過比較onClick()方法中的view參數)。

在活動:

MyOnClickListener myListener = new MyOnClickListener(); 
for (int id : buttonIdArray) 
    ((Button)findViewById(id)).setOnClickListener(myListener); 

在onclick方法:

int id = view.getId(); 
switch (id) 
{ 
case ...: 
// Do stuff 
case ...: 
// Do different stuff 
} 
19

可以對付他們都在實現OnClickListener,或活動類中,如果你喜歡一個類.. 。

import android.view.View.OnClickListener; 

    public class MyActivity extends Activity implements OnClickListener { 

     @Override public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button buttonA = (Button) findViewById(R.id.buttonA);  
     buttonA.setOnClickListener(this); 
     Button buttonB = (Button) findViewById(R.id.buttonB); 
     buttonB.setOnClickListener(this); 
     } 

    //etc... etc... 

    public void onClick(View v) { 

     switch (v.getId()) { 
     case R.id.buttonA: 
      // do something 
      break; 
     case R.id.buttonB: 
      // do something else 
      break; 
     } 
    } 

} 
+0

感謝您的提示,夥計們。 我試圖做如何顯示@ user433579,但我仍然在仿真器錯誤運行我的應用程序後「對不起! - 此應用程序CALC(進程com.tsk.calc)意外停止,請再試一次。 哪裏有問題?存在日誌錯誤或類似的文件? – user1946705 2011-04-13 10:31:07

2
import android.view.View.OnClickListener; 

public class MyActivity extends Activity implements OnClickListener { 

    @Override public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button buttonA = (Button) findViewById(R.id.buttonA);  
    Button buttonB = (Button) findViewById(R.id.buttonB); 
    buttonA.setOnClickListener(this); 
    buttonB.setOnClickListener(this); 
    } 

    public void onClick(View v) { 
    if(v==buttonA) 
    { 
     do something... 
    } 
    if(v==buttonB) 
    { 
     do something... 
    } 
} 
0

我平時做這樣的事情:

@Override 
public boolean onTouch(View v, MotionEvent event) 
{ 
    Button thisButton = (Button) v; 


    switch (event.ACTION_DOWN) 
    { 
     case MotionEvent.ACTION_DOWN: 
      for (int i = 0; i < _button.length;i++) 

       if (tagOf(thisButton) == tagOf(_button[i])) 
       { 
        System.out.println("Button " + i + " pressed!"); 
        _textView[i].setText(String.valueOf(_settingBrowser.countUpPosition(i))); 
       } 
    } 
    return false; 
} 


int tagOf (Button b) 
{ 
    return Integer.parseInt(b.getTag().toString()); 
} 

啓動一個ID號的按鈕在主類,像這樣:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    _button = new Button[FIELDS]; 


     _button[0] = (Button) findViewById(R.id.Button01); 
     _button[1] = (Button) findViewById(R.id.Button02); 
     _button[2] = (Button) findViewById(R.id.Button03); 
     _button[3] = (Button) findViewById(R.id.Button04); 
     _button[4] = (Button) findViewById(R.id.Button05); 
     _button[5] = (Button) findViewById(R.id.Button06); 


     _padListener = new SettingButtonListener(_button); 

     for (int j = 0; j < _button.length; j++){ 
      _button[j].setTag(j); 
      _button[j].setOnTouchListener(_padListener); 

     } 
} 

這是整齊的,如果你有像你這樣的按鈕一個大數目做並想要爲它們使用相同的偵聽器。 乾杯!