프로그래밍 농장

getActivity / getContext [ fragment <-> activity 스위치관련 ] 본문

Android Studio

getActivity / getContext [ fragment <-> activity 스위치관련 ]

Tennessee201 2021. 6. 4.
728x90

프레그먼트는 액티비티와 달리 Context를 상속받지 않기 때문에 바로 Context 객체를 사용할 수 없다.


그래서 getContext() 함수를 사용해 프레그먼트에 AlertDialog를 추가하려 하는데 자꾸 메소드가 null을 반환한다며 오류를 일으킨다.

 

처음엔 IllegalStateException을 키워드로 계속 구글링을 하고... 온갖 방법으로 context 객체를 받아와봤으나 계속해서 동일한 오류가 발생했다.


구글링을 하다가 결국 안드로이드 docs에서 원인을 찾게되었다.

프래그먼트가 아직 액티비티에 첨부되지 않았기 때문에 getContext, getActivity가 계속 null을 반환한 것이었다.

따라서 Fragment가 액티비티에 추가될 때 호출되어 액티비티를 받아오는 콜백 함수 onAttach를 따로 오버라이딩 해야한다.

private Context mContext; @Override public void onAttach(Context context) { super.onAttach(context); mContext = context; }


클래스에 위와 같이 작성해주면 정상적으로 context를 사용할 수 있게된다.

또, fragment에서 runOnUiThread를 사용하기 위해 getActivity() 메서드를 사용하는데, 가끔 이 함수가 null을 반환해서 앱이 강제 종료될때 가 있다.


필드에 Activity activity;를 선언하고

@Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof Activity) activity = (Activity) context; }

 

onAttach를 다음과 같이 작성해주면 에러가 발생하지 않는다.

728x90