프래그먼트에서 액티비티로의 데이터 전달.
처음엔 Fragment에서 인터페이스를 생성하고 DetailActivity에서 바로 인터페이스를 상속 받았는데
로그캣에서 이런 오류가 발생하였다.
RuntimeException MainActivity
~~~
이건 프래그먼트에서 onAttach로 액티비티에서 프래그먼트리스너(인터페이스)가 없으면 throw로 나타나게 하였는데 분명 디테일 액티비티에상속을 시켰는데도 계속 이런 오류가 발생하였다.
찾아보니 메인액티비티에 인터페이스가 상속되지 않아서 발생한 오류라고 하였다.
그래서 데이터의 전달을
Fragment -> MainActivity -> DetailActivity로 진행하였다.
interface FragmentDataListener {
fun onDataReceived(data: Bundle)
}
private var listener : FragmentDataListener? = null
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is FragmentDataListener) {
listener = context
} else {
throw RuntimeException("$context must implement FragmentDataListener")
}
}
val musicalAdapter = MusicalAdapter(dataList)
musicalAdapter.itemClick = object : MusicalAdapter.ItemClick {
override fun onClick(view : View, position: Int) {
val clickedItem =dataList[position]
val data = Bundle().apply{
putParcelable("musicalItem", clickedItem)
}
listener?.onDataReceived(data)
}
}
데이터리스트의 항목을 선택하면 그 포지션의 데이터들을 번들에 담아준다.
interface상속 받아주기.
override fun onDataReceived(data: Bundle) {
val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("musicalItem", data.getParcelable<Parcelable>("musicalItem"))
startActivity(intent)
}
val musicalItem = intent.getParcelableExtra<Musical>("musicalItem")
binding.DetailIv.setImageResource(musicalItem?.musicalImage ?: 0)
binding.DetailTopName.text = musicalItem?.musicalName
binding.DetailLocation.text = musicalItem?.musicalLocation
binding.DetailName.text = musicalItem?.musicalName
binding.detailDate.text = musicalItem?.musicalDate
받아서 사용