Kuwapp's Blog

Android と Flutter やってます

【Android】support-v7-appcompatにスタイルを対応させる

Android2系でもActionBarを使用するためにsupport-v7ライブラリのActionBarActivityを使用してみました。
単純にActivityをActionBarActivityへ書き換えただけだと次のようなエラーが出ます。

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


ActionBarActivityを使用する場合はテーマをTheme.AppCompatなどに変更する必要があります。
ググると大抵はmanifestのテーマをTheme.AppCompatなどに変更する方法が書かれていますが
スタイルをカスタマイズしている場合はそちらのを書き換えが必要。

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        <!-- Theme.AppCompatに変更 -->
        android:theme="@style/Theme.AppCompat" >
</application>

スタイルの書き換え

書き換え前

<style name="AppTheme" parent="android:Theme.Holo.Light">
     <item name="android:actionBarStyle">@style/ActionBarStyle</item>
</style>

<style name="ActionBarStyle" parent="android:Widget.Holo.ActionBar">
     <item name="android:titleTextStyle">@style/ActionBarTitleStyle</item>
     <item name="android:background">@color/gray</item>
</style>

<style name="ActionBarTitleStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
     <item name="android:textStyle">bold</item>
     <item name="android:textColor">@color/white</item>
     <item name="android:typeface">sans</item>
</style>

単純なスタイルでActionBarのタイトルと背景色をカスタマイズしています。

書き換え後

<!-- Theme.AppCompat.Lightに書き換え -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<!-- android:actionBarStyleからandroid:を省く -->
     <item name="actionBarStyle">@style/ActionBarStyle</item>
</style>

<!-- Widget.AppCompat.ActionBarに書き換え -->
<style name="ActionBarStyle" parent="Widget.AppCompat.ActionBar">
<!-- android:titleTextStyleからandroid:を省く -->
     <item name="titleTextStyle">@style/ActionBarTitleStyle</item>
<!-- android:backgroundからandroid:を省く -->
     <item name="background">@color/gray</item>
</style>

<!-- TextAppearance.AppCompat.Widget.ActionBar.Titleに書き換え -->
<style name="ActionBarTitleStyle" parent="TextAppearance.AppCompat.Widget.ActionBar.Title">
     <item name="android:textStyle">bold</item>
     <item name="android:textColor">@color/white</item>
     <item name="android:typeface">sans</item>
</style>

注意点としてandroid:titleTextStyleなどの一部でandroid:の部分を省く必要があることです。

大抵は公式に書いてあります。
Styling the Action Bar | Android Developers