Activityクラス外からActivityにイベントを通知する方法

「Activityの外からActivityを制御して画面遷移したい!」

と思っていろいろ調べたら、結構難しかった。。。 はまってしまった┐(´~`;)┌
その時の経験を書いておこうと思います。

解決策としては、イベントリスナーを独自実装するというもの。
下記が非常に参考になります。
独自リスナーを作成する
クラス同士の繋がりが、ぐっちゃぐっちゃで、
スマートではないけど、一応できました。

サンプルの説明

ボタンを押すとAndroid君とポップアップ「画像が表示されました」が表示される。

Screen Shot 2014-06-11 at 11.15.12
Screen Shot 2014-06-11 at 11.15.32

処理の内容はこんな感じ↓↓
①ボタンが押される
②画像が表示される
③画像が表示されたことを通知
④ポップアップ「画像が表示されました」が表示される

このサンプルでは4つのJavaファイルを作成します!では順番に作っていきましょう。

1. EventListenerを継承したインターファース

これが肝です!イベントリスナーを独自で作成しています。
画像が表示されている事を表す、imageWasDisplayedメソッドを提供します。

package com.example.eventlistenersample;

import java.util.EventListener;

public interface SampleListener extends EventListener {

    // 画像が表示された事をActivityに通知す
    public void imageWasDisplayed();
}
2. イベントが発生したことを通知するクラス

このinformToActivityメソッドを呼び出すことで、SampleListenerをimplementsしたクラスに画像が表示されたことを通知します。

package com.example.eventlistenersample;

public class SampleNotify {

    private SampleListener listener;

    // 画像が表示された事を通知
    public void informToActivity() {
        listener.imageWasDisplayed();
    }

    // リスナーをセットする
    public void setListener(SampleListener listener){
        this.listener = listener;
    }

}
3. ボタンが押された時に実行されるクラス

ボタンが押されたら、Android君を表示します。
そして、SampleNotifyを介してリスナーを実行しています。

package com.example.eventlistenersample;

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;

public class DisplayImg implements OnClickListener{

    private ImageView img;
    private SampleNotify sampleNotify;

    protected DisplayImg (ImageView img, SampleNotify sampleNotify) {
        this.img = img;
        this.sampleNotify = sampleNotify;
    }

    @Override
    public void onClick(View v) {

        // ImageViewに画像をセットする
        img.setImageResource(R.drawable.android);

        // SampleNotifyを介してリスナーを実行
        sampleNotify.informToActivity();
    }

}
4. SampleListenerをimplementsしたクラス

リスナーからの通知を受け取り、ポップアップ「画像が表示されました」を表示します。

package com.example.eventlistenersample;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity implements SampleListener {

    private Button btn;
    private ImageView img;
    private DisplayImg displayImg;
    private SampleNotify sampleNotify;

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

        btn = (Button) findViewById(R.id.button1);
        img = (ImageView) findViewById(R.id.imageView1);

        // SampleNotifyの生成
        sampleNotify = new SampleNotify();

        // DisplayImgクラス
        // SampleNotigyのインスタンスを渡す
        displayImg = new DisplayImg(img, sampleNotify);

        // SampleListenerにMainActivityのインスタンスをセット
        sampleNotify.setListener(this);

        // btnのクリックリスナーを設置
        btn.setOnClickListener(displayImg);

    }

    @Override
    public void imageWasDisplayed() {
        Toast.makeText(this, "画像が表示されました", Toast.LENGTH_SHORT).show();
    }

}

以上です。
やっぱりスマートじゃないですね。もっといい方法ないのかな。。。

コメントを残す

メールアドレスが公開されることはありません。