오늘의 공부는?!/Android

[Android] Fragment에서 Context 사용하기(Kotlin)

꼬물쥰 2022. 7. 24. 22:17

액티비티에서 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에서도 사용할 수 있게된다