- Today
- Total
Notice
Recent Posts
Recent Comments
Link
250x250
프로그래밍 농장
getActivity / getContext [ fragment <-> activity 스위치관련 ] 본문
728x90
프레그먼트는 액티비티와 달리 Context를 상속받지 않기 때문에 바로 Context 객체를 사용할 수 없다.
그래서 getContext() 함수를 사용해 프레그먼트에 AlertDialog를 추가하려 하는데 자꾸 메소드가 null을 반환한다며 오류를 일으킨다.
![](https://blog.kakaocdn.net/dn/by2YhK/btrEaNOpkqU/LXBdXxqSdFNy9LD0Z8Xz6k/img.png)
처음엔 IllegalStateException을 키워드로 계속 구글링을 하고... 온갖 방법으로 context 객체를 받아와봤으나 계속해서 동일한 오류가 발생했다.
구글링을 하다가 결국 안드로이드 docs에서 원인을 찾게되었다.
![](https://blog.kakaocdn.net/dn/bAxy5c/btrD6xseeOS/Pc01uQUai3py07xNsYcXck/img.png)
프래그먼트가 아직 액티비티에 첨부되지 않았기 때문에 getContext, getActivity가 계속 null을 반환한 것이었다.
![](https://blog.kakaocdn.net/dn/cc22OI/btrD9F4axbi/5YOpsZ4QHO9RpMHkpGOdD1/img.png)
따라서 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