COCO World

[Android/Kotlin] You need to use a Theme.AppCompat theme (or descendant) with this activity. 에러 대응 본문

Android

[Android/Kotlin] You need to use a Theme.AppCompat theme (or descendant) with this activity. 에러 대응

코코월드주인장 2022. 12. 7. 10:07

코드를 재빌드하는 과정에서 Manifest.xml이 삭제되는 상황이 발생했다.

매우 황당한 상황이라 당황함..

 

Tip.Manifest.xml 파일이 없어졌을때에는, app > New > other >  Android Manifest File 생성을 통해 다시 만들어 주자!

(물론, 안에 코드들은 reset되어서 다시 채워줘야 한다.....울적)

 

위의 과정을 거치고 난 후 재빌드하고 났더니 

You need to use a Theme.AppCompat theme (or descendant) with this activity. 에러가 발생!

에러가 난 위치는 Manifest.xml 에서 에 위치한 activity 안에서 theme 속성에서 error가 났다.

위의 에러를 만난 사람들은 보통 NoActionBar 속성을 적용하다가 저처럼 위의 에러가 발생한 경우가 많으실 거같다.

 

 

[사진1]android Project Manifest.xml 경로

 

[1] Manifest.xml 과 themes.xml 정의되어있는 속성 일치하는지 다시 한번 확인해주기 

    <application
        android:name=".MyApplication"
        android:allowBackup="false"
        android:fullBackupContent="false"
        android:label="Test"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        tools:replace="android:allowBackup">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme">
        </activity>

    </application>

[ 코드블럭1. Manifests.xml]  

 

 

Manifest.xml 에서 문제가 되는 Activity 내에 android:theme="@style/AppTheme" 속성을 타고 들어가 확인해주도록 한다.

맥의 경우, 슬래시한 부분을 [command + 클릭] 또는 values 폴더의 themes.xml 파일 경로를 따라 들어가보자.

 

<resources xmlns:tools="http://schemas.android.com/tools">

    <style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/white</item>
        <item name="colorPrimaryDark">@color/black</item>
        <item name="colorAccent">@color/white</item>
        <!-- No Title Bar-->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

</resources>

 

[코드블럭2. theme.xml] 

 

Manifest.xml 에서 Activity 안에 정의한 theme name="AppTheme"이  theme.xml에 제대로 정의되어있나 확인하고,

명명한 name명은 일치하는지 다시 한번 검토한다.

저는 sync하면서 여기에서 정의되어있는 <style> 내 몇몇 코드가 삭제되어있었다.

 

 

[2] MainActivity클래스에서 오버라이딩을 Activity()로 바꿔주기

package com.finger.testapp

class MainActivity : Activity() {
    private lateinit var mainBinding: ActivityMainBinding
    ...
}

 

AppCompatActivity()를 상속받은 Activity에 NotitleBar 스타일 속성을 적용하면서 에러가 발생할 수 있는데,

AppCompatActivity()는 기본적으로 ActionBar 특징을 사용하기 위한 Activity이기 때문에 AppCompatActivity와 NotitleBar를

동시에 사용하면서 문제가 발생할 수 있다고 한다. 때문에 상속받는 부모를 Activity()로 바꿔준다.

그치만 AppCompatActivity는 굳이 NotitleBar를 위해서가 아니더라도 다른 라이브러리를 위해 상속받아 사용되기 때문에 그에 따라 다른 작성했던 다른 코드들이 영향받을 수 있으니 첫번째 방법에서 해결하자!

 

 

 

[결론]

1. Manifest.xml 에 선언한 style 속성명과 theme.xml 에 선언한 style 속성명과 일치하는지 확인하고, 빠진 코드가 없는지 검토하기

2. Theme을 적용한 Activity의 오버라이딩 해주는 클래스를 해당 Theme에 구애받지 않는 클래스로 바꿔주기

 

Tip.

Manifest.xml 파일이 없어졌을때에는, app > New > other >  Android Manifest File 생성을 통해 다시 생성한다.

생성되는 경로는 app 폴더 > manifests 폴더 안에 AndroidManifest.xml 로 만들어준다.