web-dev-qa-db-ja.com

Android Button setOnClickListener Design

Androidアプリケーションを作成しています。各クラスでこれに似たコードの繰り返しを多数作成していることに気付きました。

_Button buttonX = (Button)findViewById(R.id.buttonXName);
// Register the onClick listener with the implementation above
buttonX.setOnClickListener(new OnClickListener() {
    public void onClick(View v)
    {
        //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});
_

現在15個のボタンがあり、これによりコードが見苦しくなります。誰もがこれらのすべてのコードをより効率的なものに変える方法のクラスや例を持っていますか?

  1. ボタンオブジェクト{Button buttonX (Button)findViewById(R.id.buttonXName);}を作成します
  2. リスナーを設定します{buttonX.setOnClickListener(new OnClickListener()}
  3. クリックされたかどうかを判断する{public void onClick(View v)}
  4. 次に、各ボタンに対して特定のコードを実行しますか?

誰かが何かを知っているなら、私はそれを感謝します。

43
user591162

1.6以降をターゲットにしている場合は、 Android:onClick xml属性 を使用して、繰り返しコードの一部を削除できます。 このブログ投稿 Romain Guyを参照してください。

<Button 
   Android:height="wrap_content"
   Android:width="wrap_content"
   Android:onClick="myClickHandler" />

そして、Javaクラスでは、以下のコード行を使用します。

class MyActivity extends Activity {
    public void myClickHandler(View target) {
        // Do stuff
    }
}
52
dgmltn

アクティビティにOnClickListener()を実装します...

public class MyActivity extends Activity implements View.OnClickListener {
}

各ボタンの使用...

buttonX.setOnClickListener(this);

アクティビティonClick()メソッドで、どのボタンであるかをテストします...

@Override
public void onClick(View view) {
    if (View.equals(buttonX))
        // Do something
}

またonClickでは、view.getId()を使用してリソースIDを取得し、それをswitch/caseブロックで使用して各ボタンを識別し、関連するアクションを実行できます。

27
Squonk

Android Lambadaソリューション

public void registerButtons(){
    register(R.id.buttonName1, ()-> {/*Your code goes here*/});
    register(R.id.buttonName2, ()-> {/*Your code goes here*/});
    register(R.id.buttonName3, ()-> {/*Your code goes here*/});
}

private void register(int buttonResourceId, Runnable r){
    findViewById(buttonResourceId).setOnClickListener(v -> r.run());
}

スイッチケースソリューションソリューション

public void registerButtons(){
    register(R.id.buttonName1);
    register(R.id.buttonName2);
    register(R.id.buttonName3);
}

private void register(int buttonResourceId){
    findViewById(buttonResourceId).setOnClickListener(buttonClickListener);
}

private OnClickListener buttonClickListener = new OnClickListener() {

    @Override
    public void onClick(View v){
        switch (v.getId()) {
            case R.id.buttonName1:
                // TODO Auto-generated method stub
                break;
            case R.id.buttonName2:
                // TODO Auto-generated method stub
                break;
            case View.NO_ID:
            default:
                // TODO Auto-generated method stub
                break;
        }
    }
};
10
Ilya Gazman

setOnClickListenerViewではなくButtonで定義されているため、他の何かに変数が必要ない場合は、次のように少し簡潔にすることができます。

findViewById(R.id.buttonXName).setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    //DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
    } 
});
9
Jim Blackler

配列を使用して、Androidのように複数のボタンクリックリスナーを処理できます。ここでは、配列を次のように使用して、n個のボタンのボタンクリックリスナーを設定しています。

Button btn[] = new Button[n]; 

注:nは定数の正の整数です

コード例:

//class androidMultipleButtonActions 
package a.b.c.app;

import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;

public class androidMultipleButtonActions extends Activity implements OnClickListener{
    Button btn[] = new Button[3];

    public void onCreate(Bundle savedInstanceState) {   
    super.onCreate(savedInstanceState);
        setContentView(R.layout.main);        
        btn[0] = (Button) findViewById(R.id.Button1);
        btn[1] = (Button) findViewById(R.id.Button2);
        btn[2] = (Button) findViewById(R.id.Button3);
        for(int i=0; i<3; i++){
            btn[i].setOnClickListener(this);
        }           
    }

    public void onClick(View v) {
        if(v == findViewById(R.id.Button1)){
            //do here what u wanna do.
        }
        else if(v == findViewById(R.id.Button2)){
            //do here what u wanna do.
        }
        else if(v == findViewById(R.id.Button3)){
            //do here what u wanna do.
        }
    }
}

注:書き込み方法がわからない場合は、最初にmain.xmlファイルを記述してください。wesagnd@ yahoo.comにメールしてください。

6
Wesagn

通常、ループで必要なことを実行できると思います。これは、多くのonClickメソッドよりもはるかに優れています。

同様の問題に対してループを使用する方法のデモンストレーションについては、 this answer をご覧ください。ループをどのように構築するかは、onClick関数のニーズと、それらが互いにどの程度類似しているかによって異なります。最終的な結果は、コードの繰り返しが少なくなり、保守が容易になります。

3
Matthew Willis

以下のようにView.OnClickListenerでアクティビティを実装します。

public class MyActivity extends AppCompatActivity implements View.OnClickListener {

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

        Button button = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);

        button.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        int id = view.getId();

        switch (id) {

            case R.id.button:

                  // Write your code here first button

                break;

             case R.id.button2:

                  // Write your code here for second button

                break;

        }

    }

}
1
yatin deokar
public class MyActivity extends AppCompatActivity implements View.OnClickListener {

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

        Button button = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);

        button.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        int id = view.getId();

        switch (id) {

            case R.id.button:

                  // Write your code here first button

                break;

             case R.id.button2:

                  // Write your code here for second button

                break;

        }

    }

}
1
raju dhiraj
public class MainActivity extends AppCompatActivity  implements View.OnClickListener{

    Button b1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        b1=(Button)findViewById(R.id.button);
        b1.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Toast.makeText(getApplicationContext(),"Button is Working",Toast.LENGTH_LONG).show();
    }

}
1
Anil