본문 바로가기

내일배움캠프 안드로이드 3기

[TIL] 24.01.20

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