DialogFragment에서 입력한 값을 확인버튼을 눌렀을 때 Fragment로 값을 가져올려고 한다.
나는 NumberPicker를 이용한 Dialog를 구현해놓은 상태이다.
인터페이스를 사용해서 데이터를 넘겨줄 것이다.
class DialogFragment : DialogFragment() {
private var _binding: FragmentDialogBinding? = null
private val binding get() = _binding!!
// Fragment에 데이터를 넘겨주기 위한 인터페이스
interface FragmentInterfacer {
fun onButtonClick(input: String)
}
private var fragmentInterfacer: FragmentInterfaccer? = null
fun setFragmentInterfacer(fragmentInterfacer: FragmentInterfacer?) {
this.fragmentInterfacer = fragmentInterfacer
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = DialogUploadNftDeadlineBinding.inflate(inflater, container, false)
dialog?.window?.setBackgroundDrawableResource(R.color.trans80_black)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//OK 버튼을 누르면 fragment로 data를 보내고 dismiss
binding.btnOk.setOnClickListener {
fragmentInterfacer?.onButtonClick(binding.np.value.toString())
dialog?.dismiss()
}
// Cancel버튼을 누르면 그냥 dismiss
binding.btnCancel.setOnClickListener {
dialog?.dismiss()
}
}
}
정리하자면
interface FragmentInterfacer {
fun onButtonClick(input: String)
}
private var fragmentInterfacer: FragmentInterfaccer? = null
fun setFragmentInterfacer(fragmentInterfacer: FragmentInterfacer?) {
this.fragmentInterfacer = fragmentInterfacer
}
인터페이스를 선언한 후
fragmentInterfacer?.onButtonClick("보내고자 하는 데이터")
로 데이터를 보냈다.
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.btnDialog.setOnClickListener {
//dialogfragment를 띄우는 부분
val dialog = DialogFragment()
dialog.show(requireActivity().supportFragmentManager, "DialogFragment")
// 데이터 받아 오는 부분
dialog.setFragmentInterfacer(object : UploadDeadLineFragment.FragmentInterfacer {
override fun onButtonClick(input: String) {
binding.tvResult.setText(input)
}
}
}
}
tvResult를 가진 TextView에 DialogFragment에서 받은 값을 출력할 것이다.