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の修正で衝突する心配も減りそう。