-
[fragment lifecycle] onCreatView와 onViewCreatedandroid 2023. 1. 5. 16:48
프로젝트에서 tts(Text to Speech) 부분을 하다가 오류가 떠서 정리해본다.
Activity에서 fragment가 나올 때 fragment의 tts가 실행되어야 하는데, fragment가 나올 때 fragment의 tts가 작동되지 않았다. 아무 음성도 나지 않다가 fragment의 텍스트를 터치하면 Activity의 tts가 실행되었다..
문제는 fragment 부분에 있었다.
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { viewBinding = FragmentTutorialTxt2Binding.inflate(layoutInflater) return viewBinding.root tts = TextToSpeech(context, this) }
여기서 tts의 위치가 문제였다. tts를 onCreateView에 넣는 것이 아니라, onViewCreated에 넣어야 했다.
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { viewBinding = FragmentTutorialTxt2Binding.inflate(layoutInflater) return viewBinding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) tts = TextToSpeech(context, this) //activity, context 둘 다 됨 }
이런식으로 말이다. 위의 코드처럼 작성했더니
activity에서 fragment가 나올 때, activity의 tts가 아닌 fragment의 tts가 잘 진행되었다.
fragment에서 onCreatView와 onViewCreated의 차이는 무엇일까?
이것은 fragment의 lifecycle이다.
● onCreate()
- Fragment 자체가 생성된다.
- Fragment View가 아직 생성되지 않은 상태이다.
- View와 관련된 작업X
● onCreateView()
- Fragment View를 직접 생성하고 inflate 한다.
( Fragment View가 초기화되고, 정상적으로 초기화가 되었다면 View 객체를 반환한다.)● onViewCreated()
- onCreateView()를 통해 반환된 View 객체가 onViewCreated()의 파라미터로 전달된다.
- onViewCreated() 에서부터 Fragement View의 lifecyele이 INITIALIZED 상태로 업데이트 된다.
(Fragment View가 완전히 생성되었음을 보장한다)
- 따라서,
1) View의 초기값을 설정
2) LiveData observing
3) RecyclerView나 ViewPager2에 사용될 Adatper 세팅등을 해줄 수 있다.
※ 참고 (정리하는데 도움된 블로그 주소입니다!)
https://developer.android.com/guide/fragments/lifecycle
'android' 카테고리의 다른 글
[android] ConstraintLayout 화면 비율 유지하기 (0) 2023.02.18 [android] this와 this@ (0) 2023.02.16 [해결하기] TalkBack- focus 부분과 accessiblity 부분 처리 (0) 2023.01.26 [android] Drawing circle (0) 2023.01.14 화면 크기에 상관없이 View 비율 일정하게 하기 (0) 2023.01.13