1. 안드로이드 공부
오늘은 어제 해결하지 못한 에러가 너무 신경쓰여서, 안드로이드 쪽을 켰다. 한시간 넘게 끙끙대면서 하나 해결하면 또 다른 에러가 생기고, 다시 해결하면 또 다른 에러가 생기고를 반복했다. 일단 어제 라이브러리와 플러그인 버전들을 모두 최신화 시키거나, 버전에 관한 문서들을 뒤져가며 모두 맞춰두었다. 그래서 처음의 오류는 해결을 한 상태였다.
그런데 앱을 실행하면, MainActivity를 띄우지 못하고 바로 죽으면서
java.lang.RuntimeException: Unable to start activity ComponentInfo{앱 패키지명/앱 패키지명(디렉토리).MainActivity}: android.view.InflateException: Binary XML file line #13 in 앱 패키지명:layout/activity_main: Binary XML file line #13 in 앱 패키지명:layout/activity_main: Error inflating class androidx.fragment.app.FragmentContainerView
이런 에러를 맞이했었는데 문제의 activity_main.xml의 13번째 줄부터 들여다보았다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
</LinearLayout>
13번째 줄은 navGraph를 지정하는 부분이었는데 딱히 문제될 건 안보였다. 찾아보니까 뭐 존재하지 않는 클래스를 이용한다든지 잘못된 값을 지정했다든지 할 때 나타나는 오류인듯 했는데, 필수적인 용법은 다 지킨거 같아서 nav_graph.xml을 뒤져보았다. 물론 그쪽도 fragment 요소의 id, name나 navigation의 startDestination 등등 오탈자 없이 잘 작성되어 있었다.
그래서 처음 불러오게 되는 fragement에 문제가 있나 싶어서 해당하는 FeedFragment.kt 파일을 열어봤다.
@AndroidEntryPoint
class FeedFragment: Fragment() {
private val viewModel: FeedViewModel by viewModels()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
viewModel.getMovies()
return ComposeView(requireContext()).apply {
setContent {
MovieAppTheme {
Text("FeedFragment")
}
}
}
}
}
테스트 한다고 뼈대만 작성해두긴 했는데, 여기도 문제될 건 없어보였고 결정적으로 Hilt를 이용하기 전에는 정상적으로 실행되는걸 확인했었다. 그래서 다시 에러코드를 천천히 살펴봤는데
굉장히 쎄한 내용이 보였다. 아니나 다를까 MainActivity에 @AndroidEntyPoint 어노테이션이 빠져있었다. 이제는 해결한 줄 알고 어노테이션 삽입 후 재실행 했는데
java.lang.ClassCastException: dagger.hilt.android.internal.managers.ViewComponentManager$FragmentContextWrapper cannot be cast to android.app.Activity
또 다른 오류가 등장했다.. 이번에도 Hilt인가 싶었는데, 로그를 살펴보니 아까랑은 다르게 fragment가 불러와지고 앱이 죽고 있었다. 그러니까 저 위의 FeedFragment.kt에서 viewModel.getMovies()는 동작하는 것이었다.
여기서 또 한참 고생했는데, 결론부터 말하자면 FeedFragment.kt의 onCreateView() 과정에서 View를 리턴할 때가 문제였다. 나는 ComposeView()의 인자로 Context를 전달하기 위해 requireContext()를 이용중이었는데, Hilt에서 @AndroidEntryPoint를 적용하게 되면 Context가 아닌 Context를 wrapping한 객체가 넘어온다고 한다. 이걸 알고나서 에러를 다시 읽어보니 그래서 무슨 Wrapper가 등장하고 캐스팅을 시도했구나 싶었다.
그래서 requireContext()가 아닌 requireActivity()를 이용했고
그제서야 정상적인 실행화면을 볼 수 있었다..
'내일배움캠프 안드로이드 3기' 카테고리의 다른 글
[TIL] 24.01.23 (0) | 2024.01.23 |
---|---|
[TIL] 24.01.22 (0) | 2024.01.22 |
[TIL] 24.01.19 (0) | 2024.01.19 |
[TIL] 24.01.18 (0) | 2024.01.18 |
[TIL] 24.01.17 (0) | 2024.01.17 |