안드로이드/이론

[ 안드로이드 ] BottomSheetDialog에서 Fragment로 값 전달

dongx._.2 2022. 10. 3. 23:49

BottomSheetDialog에서 Fragment로 값 전달하기

안드로이드 앱 개발 중 Fragment에서 BottomSheetDialog를 띄우고, 해당 BottomSheetDialog에서 입력된 값을 가져와야하는 상황이 생겼다.

당연히 DataBinding으로는 해결이 안되므로, 인터페이스를 활용한다.

1. 데이터 전달을 위한 인터페이스 생성

AddClassFragment.kt (BottomSheetDialogFragment)

class AddClassFragment : BottomSheetDialogFragment() {

    /** AddClassBottomSheet의 데이터를 전달하기위한 인터페이스 */
    interface BottomSheedDataReciever{
        fun setClassDatas(lectureList:ArrayList<Lecture>)
    }

    lateinit var dataReciever:BottomSheedDataReciever

    ...

}
  • BottomSheetDialog에 데이터 전달을 위한 인터페이스를 하나 생성한다.
  • 인터페이스에는 매개변수로 전달할 데이터를 선언

2. 데이터 세팅

AddClassFragment.kt (BottomSheetDialogFragment)

    private fun addCreateBtnEvent(){
        bind.addClassBtn.setOnClickListener {
            var lectureList:ArrayList<Lecture> = arrayListOf()

            val classCode = UUID.randomUUID().toString().substring(0 until 8)
            val title:String = bind.titleEditText.text.toString()
            val professor:String = bind.professorEditText.text.toString()
            val startDate = bind.startDateEditText.text.toString()
            val endDate = bind.endDateEditText.text.toString()

            lectureList.add(Lecture(
                code = classCode,
                title = title,
                professor = professor,
                startDate = startDate,
                endDate = endDate,
            ))

            dataReciever.setClassDatas(lectureList)
            dismiss()
        }
    }
  • 나같은 경우에는 수업 정보를 입력받아 받아와야하는 상황이었다.
  • 한 번에 여러 개의 수업이 추가될 수 있으므로 ArrayList로 선언해줬다.
  • 생성한 인터페이스 변수 dataReciever의 setClassDatas() 메소드에 매개변수로 수업 정보를 넣어줌

 

3. 데이터 수신

TimeTableFragment.kt (BottomSheetDialogFragment를 생성하는 프래그먼트)

    /** 수업 추가 버튼 이벤트 */
    private fun addClassBtnEventListener(){
        bind.addClassBtn.setOnClickListener{
            val bottomSheet = AddClassFragment()
            bottomSheet.show(parentFragmentManager, bottomSheet.tag)

            bottomSheet.dataReciever = object : AddClassFragment.BottomSheedDataReciever{
                override fun setClassDatas(lectureList: ArrayList<Lecture>) {
                    lectureList.forEach{
                        Log.i("수업 정보", it.toString())
                    }
                }
            }
        }
    }
  • 데이터를 받을 Fragment에서 아까 만들었던 BottomSheetDataReciever 인터페이스를 구현한다.
  • 인터페이스를 구현한 후 bottomSheet.dataReciever에 넣어주면 끝
  • 인터페이스를 외부에서 구현하게 함으로써 데이터를 전달할 수 있다.