web-dev-qa-db-ja.com

Android複数のボタンに1つのOnClickメソッド?

Androidでプログラムを少し始めました。1つのアクティビティに3つのボタンがあります。

同じOnClickイベントをすべてのボタンに(それらが完全に異なるアクションを実行する場合でも)、メソッドSwitch(id) case case caseに割り当てるコード例をいくつか見ました...

より良いアプローチは何ですか? 1つのonClickメソッドと切り替え、または多くのメソッド(各ボタンに1つ)

ありがとう。

24
Ron Gross

コーディング行を減らしたい場合はView's OnClick() with switch statementを使用し、すべてのクリックを個別に処理したい場合(コードの理解と保守を容易にするため)、すべてのbutton's onClick().を使用します

更新:

アクティビティレイアウトxmlファイルでボタンを宣言している場合は、属性Android:onClick=""すべてのボタンに同じメソッド名を付け、アクティビティにそのメソッドを実装します。これで、すべてのボタンに対して1つのメソッドが作成され、そのメソッドで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の代わりに実装されたビューのOnClickListerner'sonClickを使用する必要があるなど、アクティビティに動的に追加されたボタンに同じスイッチケースを適用できます。

23
user370305

この方法を使用します。

@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;
         }

   }
};
34
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);
    }
}
};

これが良い方法です。

6
Nik88

onClickをxml(レイアウト)に登録する方が良い方法だと思います。

編集:

関連するスレッドが見つかりました:

  1. Androidでボタンイベントを定義するためのベストプラクティス
  2. Iイベントを処理するためのベストプラクティス
2
adatapost

@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;
        }
    }
};

これは、ボタン変数を初期化したくないが、ボタンクリックイベントを追跡する場合に便利です。ありがとう!

0
Madan Sapkota

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
Xar E Ahmer