프로젝트에서 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 |