Last active
July 31, 2016 08:58
-
-
Save KazaKago/76eac08fe048a8a3e4a9 to your computer and use it in GitHub Desktop.
ダイアログの汎用基底クラス
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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