안드로이드/이론
[ 안드로이드 ] 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에 넣어주면 끝
- 인터페이스를 외부에서 구현하게 함으로써 데이터를 전달할 수 있다.