Hilt를 사용하여 프로젝트를 진행 중 이었는데 DatePicker 같은 component를 다른 클래스로 만들고 fragment에서 인스턴스를 만들어서 함수를 호출하는 과정에서 에러가 났다.
DatePickerHelper.kt
package com.gumibom.travelmaker.ui.main.findmate.meeting_post
import android.content.Context
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.FragmentActivity
import com.google.android.material.datepicker.MaterialDatePicker
import com.gumibom.travelmaker.constant.NO_DATE
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.Locale
class DatePickerHelper(private val activity : FragmentActivity) {
/**
* DatePicker 생성 함수
*/
fun pickDate(listener: (String) -> Unit) {
val builder = MaterialDatePicker.Builder.datePicker()
val today = Calendar.getInstance()
builder.setSelection(today.timeInMillis)
val datePicker = builder.build()
datePicker.show(activity.supportFragmentManager, datePicker.toString())
datePicker.addOnPositiveButtonClickListener { selectedDate ->
// 선택된 날짜를 Calendar 객체로 변환
val selectedCalendar = Calendar.getInstance()
selectedCalendar.timeInMillis = selectedDate
/*
현재 날짜보다 과거를 선택하면 선택을 할 수 없다.
*/
if (!selectedCalendar.after(today) || selectedCalendar.equals(today)) {
Toast.makeText(activity, NO_DATE, Toast.LENGTH_SHORT).show()
listener("")
} else {
val dateFormatter = SimpleDateFormat("yyyy-MM-dd", Locale.KOREA)
val dateString = dateFormatter.format(Date(selectedDate))
listener(dateString)
}
}
}
}
Fragment.kt
@AndroidEntryPoint
class MeetingPostDateFragment : Fragment() {
private var _binding: FragmentMeetingPostDateBinding? = null
private val binding get() = _binding!!
private lateinit var activity: MeetingPostActivity
private lateinit var datePickerHelper: DatePickerHelper
private lateinit var timePickerHelper: TimePickerHelper
private lateinit var findMateSearchFragment : FindMateSearchFragment
private val meetingPostViewModel : MeetingPostViewModel by activityViewModels()
override fun onAttach(context: Context) {
super.onAttach(context)
activity = context as MeetingPostActivity
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentMeetingPostDateBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
datePickerHelper = DatePickerHelper(requireActivity())
timePickerHelper = TimePickerHelper(requireActivity())
datePicker.show(activity.supportFragmentManager, datePicker.toString())
에서 처음에는 context as FragmentActivity.supportFragmet로 접근하였더니
에러가 발생하였는데 원인은 Hilt로 생성한 fragment의 context는 FragmentContextWrapper라는 상위 클래스로 인식하여 context의 타입을 명시해야 되는 것이다.
따라서 context가 필요한 class는 context로 생성자를 만드는 것이 아닌 FragmentActivity 같은 context로 명시를 해서 넘겨줘야 한다.