본문 바로가기
소소한 개발 꿀팁

프래그먼트 안에서 Activity,context 가져오기

by 지게요 2022. 3. 30.
728x90
반응형

프래그먼트로 개발을 하다 보면 Activity, Context를 가져와야 하는 경우가 생긴다.

그럴 때는 아래와 같이 사용하면 된다. 

# 사용법

## Activity 가져오기

액티비티를 가져오고 싶으면 requireAcivity()를 사용하면 된다.

예시를 들면 프래그먼트안에서 findViewById와 Toast를 사용하고 싶으면 아래와 같이 사용하면 된다.

class MainFragment : Fragment(){
  private lateinit var img : ImageView
  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
     img = requireActivity().findViewById(R.id.img)
     Toast.makeText(requireActivity(),"테스트 문구 입니다.",Toast.LENGTH_SHORT).show()
  }
}

 

## Context 가져오기

### 방법 1

context를 가져오고 싶으면 requireContext()를 사용하면 된다.

예시를 들면 프래그먼트에서 context가 필요해서 사용하고 싶으면 위에 예시와 같이 context가 필요한 자리에 사용하면 된다. 

 

### 방법 2

onAttach에서 context를 받아 부모 액티비티로 캐스팅하여 선언해놓은 부모 액티비티 변수에 할당을 하면 사용이 가능하다.

자세한 사용법은 아래를 보면 된다.

class MainFragment : Fragment(){
  // context 할당할 변수 선언
  private lateinit var mainActivity: MainActivity

  private lateinit var img : ImageView
  override fun onAttach(context: Context) { 
      super.onAttach(context) 
      // context를 액티비티로 캐스팅하여 할당해줌
      mainActivity = context as MainActivity 
   }

  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
     img = mainActivity.findViewById(R.id.img)
     Toast.makeText(mainActivity,"테스트 문구 입니다.",Toast.LENGTH_SHORT).show()
  }
}

# (get)Activity() 와 requireActivity() / (get)Context 와 requireContext의 차이점

두 개의 차이점은 null값 예외처리를 하냐 안 하냐의 차이이다.

Activity, Context는 null이면 NPE 널 포인트 오류가 나지만 requireActivity, requireContext는 null이면 예외처리를 해준다.

따라서 그냥 Activity,Context 쓰는 거보다 require 붙여 사용하는 것이 권장된다.

반응형