출처: https://youngjaekim.wordpress.com/2015/02/26/fragment에서의-actionbar-조작은-oncreateview에서-하자/
이 글은 Vardhan님의 포스트를 요약한 것입니다.
우리는 보통 ActionBar를 조작할 때 Fragment.OnCreate에 코드를 넣습니다.
아래와 같이 말이죠.
1 2 3 4 5 6 | @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); ActionBar actionBar = getActivity().getSupportActionBar(); actionBar.setTitle( "첫화면" ); } |
하지만 Fragment와 엮이면서 ActionBar를 Fragment에서 조작할 때는,
Fragment.OnCreate에서 조작할 때 Activity NullPointerException이 발생할 수 있습니다.
그 이유는 아주 복잡한 Activity-Fragment 라이프사이클과 관계 때문인데,
그 중 Activity가 destroy 되고 다시 살아날 때를 가정하면 다음의 흐름을 거칩니다.
생성
1 2 3 4 5 6 7 8 9 10 | MainActivity onCreate Fragment onAttach Fragment onCreate Fragment onCreateView Fragment onViewCreated Fragment onActivityCreated MainActivity onStart Fragment onStart MainActivity onResume Fragment onResume |
파괴
1 2 3 4 5 6 | Fragment onStop MainActivity onStop Fragment onDestroyView Fragment onDestroy Fragment onDetach MainActivity onDestroy |
복원
1 2 3 4 5 6 7 8 9 10 | Fragment onAttach Fragment onCreate // 문제 발생지점 MainActivity onCreate Fragment onCreateView Fragment onViewCreated Fragment onActivityCreated MainActivity onStart Fragment onStart MainActivity onResume Fragment onResume |
더보기
What happens? If we navigates to another activity from fragment and come back to main activity?
Here we have two scenarios, where fragment life cycle works.
1. Activity is not destroyed when user leaves it.
2. Activity got destroyed when user leaves it.
2. Activity got destroyed when user leaves it.
Activity Normal flow | Activity got destroyed |
MainActivity onCreate Fragment onAttach Fragment onCreate Fragment onCreateView Fragment onViewCreated Fragment onActivityCreated MainActivity onStart Fragment onStart MainActivity onResume Fragment onResume | MainActivity onCreate Fragment onAttach Fragment onCreate Fragment onCreateView Fragment onViewCreated Fragment onActivityCreated MainActivity onStart Fragment onStart MainActivity onResume Fragment onResume |
Fragment onStop MainActivity onStop | Fragment onStop MainActivity onStop Fragment onDestroyView Fragment onDestroy Fragment onDetach MainActivity onDestroy |
MainActivity onRestart MainActivity onStart Fragment onStart MainActivity onResume Fragment onResume | Fragment onAttach Fragment onCreate MainActivity onCreate Fragment onCreateView Fragment onViewCreated Fragment onActivityCreated MainActivity onStart Fragment onStart MainActivity onResume Fragment onResume |
문제는 마지막의 “복원” 과정에서 발생합니다. Fragment.onCreate를 호출했지만,
ActionBar는 Activity.onCreate를 지나야 활성화가 되기 때문에 Null인 상태인겁니다.
참고로, 복원 과정을 쉽게 테스트하려면 개발자 옵션에 “액티비티 유지 안함” 옵션을 켠 후
앱을 구동 → 홈버튼을 눌렀다가 → 다시 앱을 켜면 복원 과정을 재현할 수 있습니다.
'IT_Programming > Android_Java' 카테고리의 다른 글
안드로이드 앱 종료 방법 (0) | 2015.12.16 |
---|---|
[펌] Android Studio에 Retrolambda 적용하기 (0) | 2015.12.08 |
[펌] Android task,stack,flag 자세한 설명 정리 (0) | 2015.11.18 |
Android Studio 새로운 메모리 분석 도구를 품다! (Hello!! Allocation Tracker) (0) | 2015.11.16 |
오디오 포커스에 대하여 (0) | 2015.11.10 |