[Android] Fragment에서 Context 사용하기(Kotlin)
액티비티에서 Fragment를 띄우는 경우, 액티비티 내부에서 사용할 수 있던 메서드를 사용할 수 없는 경우가 많다
또 파라미터로 Context를 받는 메서드들도 어떻게 사용해야할지 난감하기도 하다
Fragement 클래스는 Context를 상속받지 않기 때문에 발생하는 것이다
따라서 일반적인 방법으로는 Fragment 내부에서 아래와 같은 메서드들을 사용하기 어렵다
1. Context에 정의된 메서드
- findViewById
- runOnUIThread
- getApplicationContext
- startActivity 등
2. context를 파라미터로 받는 메서드
- Toast 등
이러한 메서드들을 사용하기 위한 방법을 알아보도록 하자
Fragment에서 Context를 사용하기 위해서는 Context를 어딘가에서 가져와야한다
Fragment클래스의 생명주기에서 onAttach()의 메개변수로 Context가 들어온다
override fun onAttach(context: Context) {
super.onAttach(context)
}
이렇게 매개변수로 들어온 Context는 Fragment를 띄운 Activity로 형변환해서 사용할 수 있다
Fragment의 전역변수로 선언하고 onAttach()에서 할당해두면
Fragment 어디서나 Context를 참조해서 사용할 수 있다
코드 작성방법
1) Fragment에 전역변수로 Context 참조할 변수 선언
2) onAttach()에서 Context를 Activity로 형변환해서 할당
class ProfileFragment : Fragment() {
// Context 할당할 변수를 프로퍼티로 선언
lateinit var mainActivity: MainActivity
override fun onAttach(context: Context) {
super.onAttach(context)
// Context를 액티비티로 형변환해서 할당
mainActivity = context as MainActivity
}
}
ProfileFragment는 MainActivity에서 띄운 Fragment이다
그래서 전역변수 타입을 MainActivity로 선언해주었고, onAttach()에서 context를 MainActivity로 형변환한 것이다
이렇게 코드를 작성하면 위에서 언급한 원래 사용하지 못했던 메서드들을 Fragment에서도 사용할 수 있게된다