1. 程式人生 > >You need to use a Theme.AppCompat theme (or descendant) with this activity解決方法

You need to use a Theme.AppCompat theme (or descendant) with this activity解決方法

當我的MainActivity繼承自v7包中的ActionBarActivity或者AppCompatActivity時,如果在style.xml檔案中指定MainActivity所使用的樣式如下:

<style name="AppTheme" parent="android:Theme.Material.NoActionBar">
        <!-- 5.0開始,可以在Style.xml檔案中統一配置App的樣式 -->
        <!-- 狀態列的顏色 -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <!-- 一級文字的顏色 -->
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <!-- 二級文字的顏色 -->
        <item name="colorAccent">@color/colorAccent</item>
    </style>

會報如下錯誤:

java.lang.IllegalStateException:You need to use a Theme.AppCompat theme(or descendatn) with this activity

那麼如何解決這個問題呢?網上很多人生說將MainActivity改為繼承自Activity即可,但是這樣的話就早晨無法相容老版本的樣式,或者說是無法再5.0之前的版本實現MaterialDesign的效果,那麼該如何正確的修改呢? 

解決步驟如下:

1、res/styles.xml檔案中重新新增一個style樣式AppTheme.Base,然後將AppTheme繼承自AppTheme.Base,程式碼如下:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="AppTheme.Base">
        <!-- Customize your theme here. -->

    </style>
    <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:windowBackground">@android:color/white</item>
    </style>
</resources>

2、在res檔案中建立values-v21資料夾,然後在此資料夾下建立styles.xml檔案,程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="AppTheme" parent="AppTheme.Base">
        <item name="android:colorPrimary">@color/colorPrimary</item>
        <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="android:colorAccent">@color/colorAccent</item>
    </style>
</resources>
說明:values-v21資料夾中的內容是專門針對API21以上的版本所使用的配置檔案,也就是說如果是API21之前的檔案就是使用res/values中的styles.xml,否則使用values-v21資料夾下的styles.xml

通過以上兩步,就可以輕鬆實現MainActivity還是繼承自AppCompatActivity,也就是說可以將Material Design的效果執行在API21之前版本的手機上,並且API21之前的樣式和API21以後的樣式可以由我們自己決定