19
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Android】EnumでFragment→Activityのイベントを実装

Last updated at Posted at 2015-07-30

AndroidアプリでFragmentからActivityに対して処理を投げたい場面があったとする。(私はありました)
まだまだ試行錯誤中。

Fragment→Activityの経路の確保

ここはよくあるやり方で、onAttachからインターフェースを渡すスタイルで実装

Activity
public class HogeActivity extends Activity implements
        HogeFragment.HogeFragmentListener {
}

ここでFragment→Activityのイベントがたくさんある場合、全部並べると以下の通り

ややこしい例
public interface HogeFragmentListener {
    void onHogeEvent1();
    void onHogeEvent2();
    void onHogeEvent3();
    void onHogeEvent4();
}

こうすると数が増えるし名前を決めるのも面倒なので、渡すイベントを一つにまとめる

enumでやる例
public interface HogeFragmentListener {
    void onHogeFragmentEvent(HogeEvent event);
}

実際のFragment側の記述はこんな感じ

Fragment
public class HogeFragment extends Fragment {
    private Activity mActivity = null;
    private HogeFragmentListener mFragmentListener = null;

    public interface HogeFragmentListener {
        void onHogeFragmentEvent(HogeEvent event);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        // ここで取得すれば再生成された時にちゃんと再取得できる
        if (!(activity instanceof HogeFragmentListener)) {
            throw new UnsupportedOperationException(
                    TAG + ":" + "Listener is not Implementation.");
        } else {
            mFragmentListener = (HogeFragmentListener) activity;
        }
        mActivity = activity;
    }
}

HogeFragmentListenerで渡すHogeEventをEnumで実装する

パフォーマンスTipsでも解禁されてるし、折角なのでEnumを使う

HogeEvent
public enum HogeEvent {

    EVENT1 {
        @Override
        public void apply(Activity activity) {
            // Fragment→ActivityのActivity側の処理とか
        }        
    },
    EVENT2 {
        @Override
        public void apply(Activity activity) {
            // Fragment→ActivityのActivity側の処理とか
        }        
    },
    EVENT3 {
        @Override
        public void apply(Activity activity) {
            // Fragment→ActivityのActivity側の処理とか
        }        
    },
    EVENT4 {
        @Override
        public void apply(Activity activity) {
            // Fragment→ActivityのActivity側の処理とか
        }        
    }

    abstract public void apply(Activity activity);
}

こんな感じで作っておけば、Activity側の記述が以下のように最低限で済む

Activity側の実装
@Override
public void HogeFragmentEvent(HogeEvent event) {
    event.apply(this);
}

これでFragmentの数が増えても、Fragment→Activityな処理はそれぞれのEnumEventクラスを
更新すればよくなり、いちいちActivityもFragmentも修正していく必要が削減される。
複数人開発なら、Activityの修正で衝突する心配も減りそう。

19
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?