2011-10-24 197 views
20

我在android中開始一點點編程, 我在單個活動中有3個按鈕。Android的一個OnClick方法適用於多個按鈕?

我看到分配相同OnClick事件所有的按鈕(即使他們的表現完全不同的動作)一些示例代碼和方法Switch(id)案件審理的案件......

有什麼更好的辦法?一個onClick方法和切換或許多方法,每個按鈕一個?

謝謝。

回答

19

如果你想降低編碼線,然後使用View's OnClick() with switch statement,如果要單獨處理所有的點擊(爲便於理解和維護的代碼),然後使用單獨的所有button's onClick().

更新:

如果您已在活動佈局xml文件中聲明Button,而不是使用相同方法名稱爲所有按鈕編寫屬性android:onClick="",並在您的活動中實施該方法。現在你有一個方法來處理所有的按鈕,並且在這個方法中用id來區分按鈕。

例子:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" > 
    <Button android:id="@+id/button1" 
      android:layout_width="wrap_content" 
      android:onClick="buttonOnClick" 
      android:layout_height="wrap_content" 
      android:text="Hello, I am a Button 1" /> 
    <Button android:id="@+id/button2" 
      android:layout_width="wrap_content" 
      android:onClick="buttonOnClick" 
      android:layout_height="wrap_content" 
      android:text="Hello, I am a Button 2" /> 
    <Button android:id="@+id/button3" 
      android:layout_width="wrap_content" 
      android:onClick="buttonOnClick" 
      android:layout_height="wrap_content" 
      android:text="Hello, I am a Button 3" /> 
</LinearLayout> 

現在,在您的活動實施buttonOnClick一樣,

public void buttonOnClick(View view) 
{ 
switch(view.getId()) 
{ 
    case R.id.button1: 
    // Code for button 1 click 
    break; 

    case R.id.button2: 
    // Code for button 2 click 
    break; 

    case R.id.button3: 
    // Code for button 3 click 
    break; 
} 
} 

或者你可以在你的活動適用同一交換機的情況下動態添加按鈕, 一樣,而不是buttonOnClick您必須使用實現了View的OnClickListerner的onClick

6
this.btnAddFriedtoFacebook = (Button) this.findViewById(R.id.btnAddFriedtoFacebook); 
this.btnAddFriedtoFacebook.setOnClickListener(this.backButtonClickListener); 

public OnClickListener backButtonClickListener = new OnClickListener() 
{ 
public void onClick(final View view) 
{ 
    if (view == MatchInfoActivity.this.btnBack) 
    { 
     MatchInfoActivity.this.finish(); 
    } 
    if(view == MatchInfoActivity.this.btnAddFried){ 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     MatchInfoActivity.this.startActivity(i); 
    } 
    if(view == MatchInfoActivity.this.btnAddBuddy){ 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     MatchInfoActivity.this.startActivity(i); 
    } 
} 
}; 

這是好方法。

+0

他並不是在問如何處理點擊,而是他已經意識到的兩種技術中的哪一種是首選。 – goto10

34

用這樣的方式:

@Override 
public void onCreate(Bundle savedInstanceState) { 
     button1.setOnClickListener(onClickListener); 
     button2.setOnClickListener(onClickListener); 
     button3.setOnClickListener(onClickListener); 
} 

private OnClickListener onClickListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     switch(v.getId()){ 
      case R.id.button1: 
        //DO something 
      break; 
      case R.id.button2: 
        //DO something 
      break; 
      case R.id.button3: 
        //DO something 
      break; 
     } 

    } 
}; 
+0

爲什麼你使用final? –

+0

這是抽象的方法。我認爲我們不需要關心它。 –

+0

如果我們在不同的活動中有按鈕,我們該怎麼做? – Bran

0

在XML佈局中註冊onClick事件,然後在代碼中處理它。這是我會怎麼做:

<Button 
android:id="@+id/btplus" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="Click me" 
android:onClick="onBtnClicked"> 

的方法。class

public void onBtnClicked(View v) { 
     switch (v.getId()) { 
     case R.id.btplus: 
      Toast.makeText(getApplicationContext(), "Plus is clicked" + "+", Toast.LENGTH_SHORT).show(); 
      break; 
     case R.id.btminu: 
      Toast.makeText(getApplicationContext(),"Minus is clicked" + "-", Toast.LENGTH_SHORT).show(); 
      break; 
     default: 
      break; 
     } 
    } 
0

@Nguyen的答案很少。

findViewById(R.id.buttonOne).setOnClickListener(buttonClickListener); 
.... .... .... .... 
findViewById(R.id.buttonN).setOnClickListener(buttonClickListener); 

private View.OnClickListener buttonClickListener = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.buttonOne: 
       // do something 
       break; 
      .... .... .... .... 
      case R.id.buttonN: 
       // do something 
       break; 
     } 
    } 
}; 

如果您不想初始化按鈕變量,但想要追蹤按鈕單擊事件,這可能很有用。謝謝!

相關問題