Androidのリスナーを使ったイベント処理について

2019年5月17日

本稿ではリスナーを使ったイベント処理の実装方法を複数紹介し、

それぞれのメリットデメリットを説明していきます。

 

 

リスナーを使ったイベント処理の実装方法

大枠3つの実装方法があります。

細かく言えば他にも実装方法はあるのですが実用的ではないのでここでの説明は割愛します。

  1. コンポーネント毎にリスナーを実装する。
  2. Activity自身にリスナーを実装する。
  3. publicなクラスにリスナーを実装する。

次項でそれぞれの具体的な実装方法を見ていきましょう。

 

コンポーネント毎にリスナーを実装する

この方法はコンポーネント毎にその都度リスナーを登録していく方法です。

例としては下記のコードのようにボタン毎にリスナーを登録していきます。

public void onCreate(Bundle savedInstanceState){
 
    Button buttonA = (Button) findById(R.id.buttonA);
    botton.setOnClickListener(new OnClickListener(){
        public void onClick(View view){
            //ボタンAの処理
        }
    });
    Button buttonB = (Button) findById(R.id.buttonB);
    botton.setOnClickListener(new OnClickListener(){
        public void onClick(View view){
            //ボタンBの処理
        }
    });
}

コンポーネント毎にリスナーを実装するメリット

  • 実装が直感的にわかりやすい。

 

コンポーネント毎にリスナーを実装するデメリット

  • Activityのコンポーネント数によって、onCreate内のステップ数が肥大化する
  • 同じ処理を実装する場合、冗長なコードが発生する

 

Activity自身にリスナーを実装する

この方法はActivity自身にimplementsでリスナーを実装します。

 

// implementsでActivity自身にリスナーを含める
public class SampleActivity extends Activity implements OnClickListener{
    public void onCreate(Bundle savedInstanceState){
        Button buttonA = (Button) findById(R.id.buttonA);
        Button buttonB = (Button) findById(R.id.buttonB);
        //thisでActivity(自インスタンス)をリスナーとしてセット
        bottonA.setOnClickListener(new OnClickListener(this);
        bottonB.setOnClickListener(new OnClickListener(this);
    }
    @Override
    public void onClick(View v){
        //処理
             switch (v.getId()) {
                 case R.id.buttonA:
                     //ボタンAの処理
                     break;
                 case R.id.buttonB:
                     //ボタンBの処理
                     break;
             }
    }
}

Activity自身にリスナーを実装するメリット

  • イベント処理を一か所に集約できるためコードが見やすい
  • onClickを記述しなかった場合にコンパイルエラーがでるので実装漏れを防げる

Activity自身にリスナーを実装するデメリット

  • コンポーネント単位でメソッドの分類が出来ないため、
    上記例のようにonCllik内でswich文による分岐処理が必要になる

 

publicなクラスにリスナーを実装する

この方法はpublicなクラスとしてリスナーとイベントを処理するためだけのクラス作る方法です。

public class ButtonAction implements OnClickListener{
        @Override
        public void onClick(View v){
            //処理
        }
}

 

publicなクラスにリスナーを実装するメリット

  • 複数Activityから呼び出しができるため再利用性が高い

 

publicなクラスにリスナーを実装するデメリット

  • contextやActivity内のメソッドなどのパラメータの受け渡しに手間がかかり、
    かつどのような方法でパラメータ受け渡しをするか検討する必要がある