종이상자의 작은일기장(1st)

안드로이드에서 Material Components의 일부로 제공하는 카드 레이아웃은 반드시 테마도 Material Components를 상속받거나 그 자체여야합니다. 하지만 한동안 해당 테마로 설정하지 않아도 작동할 수 있도록 풀려 있었고, 이것이 저를 비롯한 일부 사용자에게 라이브러리 업데이트 시 갑작스러운 오류로 인식하는 일도 생겼습니다.

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:statusBarColor">@android:color/darker_gray</item>
        <item name="android:navigationBarColor">@android:color/background_light</item>
    </style>

    <style name="AppTheme.NoActionBar" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:statusBarColor">@android:color/darker_gray</item>
        <item name="android:navigationBarColor">@android:color/background_light</item>
    </style>
    <style name="TitleTextTheme" parent="@style/TextAppearance.AppCompat.Medium">
        <item name="android:textAlignment">center</item>
    </style>
    <style name="AppTheme.NewMemoTheme">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:statusBarColor">@android:color/darker_gray</item>
        <item name="android:navigationBarColor">@android:color/background_light</item>
        <item name="android:textColor">@android:color/background_dark</item>
    </style>

    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Light" />

    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

</resources>

보통은 위 내용처럼 style.xml의 AppTheme 부분을 Theme.MaterialComponents에 속하는 항목으로 상속하게 해놓은 다음,

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="pw.pbdiary.******">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:name=".EncryptEngine"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".ShowMemoActivity"
            android:theme="@style/AppTheme.NoActionBar"/>
        <activity
            android:name=".NewMemoActivity"
            android:theme="@style/AppTheme.NewMemoTheme" />
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

AndroidManifest.xml 파일에서 필요한 Activity의 'android:theme' 값을 Theme.MaterialComponents의 상속을 받는 테마로 바꾸면 됩니다.

하지만 만약 이를 fragment로 분리해놓았을 때에는 제대로 적용이 되지 않아 여전히 Theme.MaterialComponents를 사용하지 않았다고 오류를 뱉게 되는데, 이때는 해당 fragment 파일에 가서 아래와 같이 적용하면 정상적으로 처리됩니다.

<fragment
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/fragmentMain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:theme="Theme.MaterialComponents.DayNight.NoActionBar">