본문 바로가기
Android

[Android] DialogFragment listener 만들때 주의점 (by. Kotlin)

by 중곰 2021. 2. 15.

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 객체 생성해주는데, 이것 때문에 삽질해서 기록한다.

 

부족한 내용이지만 참고하시거나, 사용하실때

잘못된 내용이 있으시면 알려주세요.

 

반응형