2009-10-01 33 views
40

比方說,我有幾個按鈕,在LinearLayout中,其中2個是:Android:使用帶有setOnClickListener/onClick的SWITCH語句獲取多個按鈕?

mycards_button = ((Button)this.findViewById(R.id.Button_MyCards)); 
exit_button = ((Button)this.findViewById(R.id.Button_Exit)); 

我對他們兩人的註冊setOnClickListener()

mycards_button.setOnClickListener(this); 
exit_button.setOnClickListener(this); 

我如何做一個切換到區分Onclick中的兩個按鈕?

public void onClick(View v) { 
    switch(?????){ 
    case ???: 
     /** Start a new Activity MyCards.java */ 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
     break; 
    case ???: 
     /** AlerDialog when click on Exit */ 
     MyAlertDialog(); 
     break; 
} 
+0

我不喜歡使用菜單這一點,因爲我可以把按鈕的任何地方我要上佈局... – Hubert 2009-10-01 14:22:41

回答

103

用途:

public void onClick(View v) { 

    switch(v.getId()){ 

     case R.id.Button_MyCards: /** Start a new Activity MyCards.java */ 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
     break; 

     case R.id.Button_Exit: /** AlerDialog when click on Exit */ 
     MyAlertDialog(); 
     break; 
    } 
} 

請注意,這不會在Android的庫項目工作(由於http://tools.android.com/tips/non-constant-fields),您將需要使用類似:

int id = view.getId(); 
if (id == R.id.Button_MyCards) { 
    action1(); 
} else if (id == R.id.Button_Exit) { 
    action2(); 
} 
+0

作品好了!我想知道我怎麼沒有自己嘗試過這個! 非常感謝您的支持。 H. – Hubert 2009-10-01 14:46:30

+0

當我這樣做時,eclipse告訴我:「case表達式必須是常量表達式」 – dell116 2012-06-19 21:41:40

+1

@ dell116它告訴你,因爲你使用的變量不是常量。如果x必須在到達之前被修改,則在開關之前聲明它抱怨的變量爲final,例如「'final int x = 5;'」,或者聲明一個變量y「'final int y = x;'」案件。 – aggregate1166877 2012-08-28 16:11:23

7

另一種選擇是在setOnClickListener()中添加一個新的OnClickListener作爲參數並覆蓋onClick() - 方法:

mycards_button = ((Button)this.findViewById(R.id.Button_MyCards)); 
exit_button = ((Button)this.findViewById(R.id.Button_Exit)); 

// Add onClickListener to mycards_button 
mycards_button.setOnClickListener(new OnClickListener() { 
    public void onClick(View view) { 
     // Start new activity 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
    } 
}); 

// Add onClickListener to exit_button 
exit_button.setOnClickListener(new OnClickListener() { 
    public void onClick(View view) { 
     // Display alertDialog 
     MyAlertDialog(); 
    } 
}); 
+5

我一直髮現,確實很混亂 – 2009-10-08 15:25:42

+0

我喜歡它,但我想這幾乎是個人喜好的問題。 – aspartame 2009-10-08 16:59:31

+0

不,不要使用它。因爲任何時候你使用setOnclickListener(new OnclickLisener(){...}); Android創建一個新線程來捕捉行動。所以想象一下,如果你有10個按鈕,你有10個線程,那就不好。 – Cocorico 2014-06-12 09:44:53

1

還有第三種選擇。在你的onCreate()方法中,找到你所有的按鈕視圖並將它們保存爲類數據成員。然後,您可以級聯一組if-else語句來查找哪個是哪個。它有點雜亂,但如果你不知道按鈕的ID(如果你在java代碼中生成按鈕會變得複雜),這是必須的。

@Override 
public void onClick(View v) { 
    if (v == m_myCards) { 
     Intent intent = new Intent(this, MyCards.class); 
     this.startActivity(intent); 
    } 
    else if (v == m_exit) { 
     MyAlertDialog(); 
    } 
    else if (v == m_back) { 
     finish();    
    } 

關於這項技術的另一個好處是,它的靈活和快速(無不必解析的ID)。壞消息是你需要將這些小部件放在內存中。

不知道哪種方法更好。

+1

這也可以用switch語句嗎? – winklerrr 2017-03-24 10:22:38

+0

@winklerrr - 不,在java中的switch語句需要常量,而不是變量。這就是爲什麼這個例子使用不太優雅的if-else語句系列。 – 2017-04-09 19:01:22

+0

如果你這樣聲明方法:'onClick(final View v)'? – winklerrr 2017-04-10 09:12:02

2

onCreate方法中: -

{ 

    Button b = (Button)findViewById(R.id.button1); 
    b.setOnClickListener((View.OnClickListener)this); 

    b = (Button)findViewById(R.id.button2); 
    b.setOnClickListener((View.OnClickListener)this); 
} 

@Override 
public void OnClick(View v){ 

    switch(v.getId()){ 
     case R.id.button1: 
      //whatever 
      break; 

     case R.id.button2: 
      //whatever 
      break; 
} 
+0

如果實現了「OnClickListener」接口,則不需要將您的活動強制轉換爲「OnClickListener」。 – winklerrr 2017-03-24 10:21:34

5
public class MainActivity extends Activity 
     implements View.OnClickListener { 
    private Button btnForward, btnBackword, btnPause, btnPlay; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     initControl(); 
    } 

    private void initControl() { 
     btnForward = (Button) findViewById(R.id.btnForward); 
     btnBackword = (Button) findViewById(R.id.btnBackword); 
     btnPause = (Button) findViewById(R.id.btnPause); 
     btnPlay = (Button) findViewById(R.id.btnPlay); 
     btnForward.setOnClickListener(this); 
     btnBackword.setOnClickListener(this); 
     btnPause.setOnClickListener(this); 
     btnPlay.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.btnForward: 
       break; 
      case R.id.btnBackword: 
       break; 
      case R.id.btnPause: 
       break; 
      case R.id.btnPlay: 
       break; 
     } 
    } 
} 
+0

正確地格式化代碼 – 2015-06-19 10:41:43