ViewPager를 처음 본 후 코드량과 아웃풋에 반해서 가지고 있던 앱들의 메인 네비게이션을 모두 Viewpager로 변경을 했는데, 크고 작은 문제들이 계속 나오고 있다.


그 중에서 오늘 발견한 문제는 Fragment 안에 있는 getAcitivity()가 null이 되면서 null exception error를 뱉고 죽는 현상이었다.


Fragment 안에서 아래와 같이 토스트 메시지를 뛰우고 인텐트를 통해 다른 페이지로 이동하는 코드에서 발생했는데 처음보는 현상이라 원인이 Viewpager일거라고 상상도 못했다. 

Toast.makeText(getActivity(), "메시지", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getActivity(), PhoneNumCheckActivity.class);
startActivity(intent);

getActivity().finish();

구글을 뒤적뒤적하다보니 Fragment가 전환되는 과정에서 activity가 detach 된 것 같다는 의견이 다수였던 것 같다.


Fragment생명주기 상 OnAttach()에서 activity를 연결하는 과정을 통하면 해결된다는 것 같았다. 그런데 어떻게????


아래와 같이 하라는데.....뭘 어떻게 하라는 건지 몰라 살짝 패닉이 왔다.



출처: 

- https://codedump.io/share/ffbRcoGlaWq/1/getactivity-returns-null-in-fragment-function 

- http://stackoverflow.com/questions/6215239/getactivity-returns-null-in-fragment-function

onAttach(Activity activity)


그래서 다시 "viewpager getactivity null"이란 키워드로 집중적으로 찾다보니 아래 페이지를 찾게 됐다.

http://stackoverflow.com/questions/38891906/why-does-getactivity-returns-null-in-fragment-in-viewpager


정확하게 내가 가진 문제를 해결하는 방법은 아니었지만 그래도 코드 중에 힌트가 많이 있어 해결하는데 도움이 많이 됐다.

private Activity activity;


@Override
public void onAttach(Context context) {
super.onAttach(context);

if (context instanceof Activity) {
activity = (Activity) context;
}

}

위에서 볼 수 있는 것처럼 일단 onAttach()에서 activity를 context와 연결해주고, 연결된 acitivity를 아래와 같이 getActivity()처럼 활용하면 잘 작동한다.

Toast.makeText(activity, "전화번호 인증이 되지 않았습니다. 인증페이지로 이동합니다", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(activity, PhoneNumCheckActivity.class);
activity.startActivity(intent);

activity.finish();

제대로 된 해결책인지는 모르지만 암튼 잘된다.

+ Recent posts