Skip to content

Instantly share code, notes, and snippets.

@KazaKago
Last active July 31, 2016 08:58
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save KazaKago/76eac08fe048a8a3e4a9 to your computer and use it in GitHub Desktop.
ダイアログの汎用基底クラス
import android.app.Activity;
import android.app.DialogFragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
/**
* コールバックを持つダイアログの基底クラス<br>
*
* @param <Interface>
* @author Kensuke
*/
public abstract class BaseCallbackDialog<Interface> extends DialogFragment {
/**
* Listenerタイプ一覧
*
* @author PTAMURA
*/
private enum ListenerType {
/**
* Activityからリスナーがセットされた時
*/
ACTIVITY,
/**
* Fragmentからリスナーがセットされた時
*/
FRAGMENT,
/**
* それ以外からリスナーがセットされた時
*/
OTHER,
}
/**
* コールバックリスナー
*/
private Interface mListener;
/**
* Listenerタイプ
*/
private final static String ARG_LISTENER_TYPE = "listenerType";
@SuppressWarnings("unchecked")
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Bundleからリスナーのタイプを取り出す
Bundle bundle = getArguments();
ListenerType listenerType = (ListenerType) bundle.getSerializable(ARG_LISTENER_TYPE);
// リスナーをセットしなおす
if (listenerType == ListenerType.ACTIVITY) mListener = (Interface) activity;
else if (listenerType == ListenerType.FRAGMENT) mListener = (Interface) getTargetFragment();
}
/**
* ダイアログのイベントリスナーを取得する
*
* @return
*/
public Interface getCallbackListener() {
return mListener;
}
/**
* ダイアログのイベントリスナーを設定する
*
* @param listener
*/
public void setCallbackListener(Interface listener) {
mListener = listener;
// リスナーのタイプをチェック
ListenerType listenerType;
if (listener == null) {
//nullの場合
listenerType = null;
setTargetFragment(null, 0);
} else if (listener instanceof Activity) {
//Activityの場合
//onAttachでActivityと接続したときにlistenerを更新する。
listenerType = ListenerType.ACTIVITY;
setTargetFragment(null, 0);
} else if (listener instanceof Fragment) {
//Fragmentの場合
//setTargetFragmentに持たせておくことでgetTargetFragmentから適切なインスタンスを取り出す。
listenerType = ListenerType.FRAGMENT;
setTargetFragment((Fragment) listener, 0);
} else {
listenerType = ListenerType.OTHER;
setTargetFragment(null, 0);
}
// 取得したリスナーのタイプをBundleに持たせておく
Bundle bundle = getArguments();
bundle.putSerializable(ARG_LISTENER_TYPE, listenerType);
setArguments(bundle);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment