DialogFragment를 사용할 때 listener가 필요한 경우가 발생하였다.
이때, 내가 사용할 DialogFragment가 Activity or Fragment 위에서 띄우는지 정확히 확인 후 Listener를 사용한다.
그저 예제에 따라 진행하다가 삽질에 삽질을... 하였기에 적어둔다.
1. Activity에서 DialogFragment
try {
val fm: FragmentManager? = supportFragmentManager
val dialogFragment = DialogFragment()
val args = Bundle()
args.putString(C_TITLE, "Activity")
dialogFragment.arguments = args
dialogFragment.isCancelable = false
if (fm != null) {
dialogFragment.show(fm, DialogFragment.TAG)
}
} catch (e: Exception) {
//Exception is ignored.
}
2. Fragment에서 DialogFragment
try {
val fm: FragmentManager? = childFragmentManager
val dialogFragment = DialogFragment()
val args = Bundle()
args.putString(C_TITLE, "Fragment")
dialogFragment.arguments = args
if (fm != null) {
dialogFragment.show(fm, DialogFragment.TAG)
}
} catch (e: Exception) {
//Exception is ignored.
}
※ 위에서 차이점이 있는데, FragmentManager 객체 생성할때 다르다.
이점을 유의해서 진행필요
그럼 이제 DialogFragment을 확인해보면,
DialogFragment 생명주기 Attach에서 Listener 생성에서 주의할 곳을 보자.
3. DialogFragment
// Listener
interface OnInputListener {
fun sendResult(input: String?)
}
private lateinit var onInputListener: OnInputListener
// 생명주기
override fun onAttach(context: Context) {
super.onAttach(context)
try {
// Activity
if(targetFragment != null){
onInputListener = targetFragment as OnInputListener
}
// Fragment
if (parentFragment != null) {
onInputListener = parentFragment as OnInputListener
}
} catch (e: ClassCastException) {
}
}
- 지금 Activity or Fragment를 한번에 처리하기 위해 Attach 안에
targetFragment & parentFragment 모두를 선언하였다.
● Activity 일 경우 targetFragment
● Fragment 일 경우 parentFragment
즉, DialogFragment의 Listener을 받을 대상이 Activity or Fragment 인지를 판단하여 주의하여 사용하면된다.
예제만 나와 있는걸 따라했을때,
대부분의 예제에서는 targetFragment로 Listener 객체 생성해주는데, 이것 때문에 삽질해서 기록한다.
부족한 내용이지만 참고하시거나, 사용하실때
잘못된 내용이 있으시면 알려주세요.