interfaceを使った独自リスナーの作り方

独自でリスナーを作り、それを特定のクラスにする実装する場合は次の手順を踏みます。

  1. 独自リスナーのインターフェイスを作成する。
  2. あるクラスにリスナーを追加する。
  3. 別のクラスにリスナーを実装し、関数を定義する。

独自リスナーを作る

まず、MyListenerのような名前で次のようにインターフェイスを作成します。

MyListener.java
package com.MyApp.myapp;

public interface MyListener 
{
    void onMyBtClick();
}

クラスにリスナーを追加する

では、自作したリスナーを利用するクラスを作ります。ここでは次のようにボタンクラスを拡張してMyButtonというクラスを作成します。

package com.MyApp.myapp;

class MyButton extends Button
{
    private MyBtClickListener listener;

    //独自リスナーを実装させるボタンの定義
    public MyButton(Context context) 
    {
        super(context);
        
        setOnClickListener(new View.OnClickListener() 
        {
            @Override
            public void onClick(View v) 
            {
                //リスナーが未追加でないか確認
                if(listener != null){
                    listener.onGrpStartBtClick();
                }
            }
        });
    }
    
    //リスナーを追加するメソッド
    public void addMyListener(MyBtClickListener listener) 
    {
        this.listener = listener;
    }
}

このようにリスナーを追加されるクラスではクラス内にリスナーをメンバに持ち、addMyListenerなどのメソッドでリスナーを追加します。

今回はボタンなのでボタンがクリックされたときにリスナーを実装したクラスからの関数を実行できるようにしています。

リスナーを実装する

最後に自作したリスナーをActivityクラスなどに実装します。クラスに実装しているのが次のコードです。

public class MainActivity extends Activity implements MyListener
{
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        MyButton button = new MyButton(this);
        button.addListener(this);
            //リスナーをMyButtonクラスに追加
        addContentView(button, new LayoutParams(LayoutParams.WRAP_CONTENT,  LayoutParams.WRAP_CONTENT) );
            //ボタンをアクティビティに追加する。
        
    }
    
    //リスナー関数の定義
    void onMyBtClick() 
    {
        Log.d("MainActivity : ", "onMyBtClickメソッドの呼び出し");
    }
}

上のActivityクラスではMyListenerを実装し、そのリスナーのonMyBtClickメソッドを定義しています。

これでMyButtonによって作られたボタンをクリックした場合のみ、MainActivityクラスのonMyBtClickメソッドを呼ぶことができるようになります。

最後に

この例ではアクティビティクラスとボタンクラスの間でイベントをやりとりしましたが、フラグメントやそれ以外のクラスとのイベントのやり取りも可能です。

独自のリスナーとそれを追加するクラスと実装するクラスがあれば基本的にどのような場合でも今回紹介した方法が使えると思います。

関連項目
プライバシーポリシー