如何使用colorPrimary和colorPrimaryDark使用AppCompat v7:21创建不同的应用主题

时间:2014-12-31 01:13:15

标签: android android-styles

我一直在寻找有关如何指定多个主题的不同教程,以便用户可以切换主题。

他们经常说要创建不同的主题:

<resources>

    <style name="RedTheme">
        <item name="android:background">#FF0000</item>
    </style>

    <style name="BlueTheme">
        <item name="android:background">#0000FF</item>
    </style>

</resources>

但是在使用AppCompat-v7:21时,您可以使用colorPrimarycolorPrimaryDark等来指定应用范围的颜色。我还没有找到为这些指定不同价值的方法。

我已经尝试了这个,但它不起作用:

styles.xml

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

    <style name="AppTheme.Base" parent="Theme.AppCompat.Light">    
        <item name="android:windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
    </style>

    <style name="BlueTheme" parent="AppTheme.Base">
        <item name="colorPrimary">@color/blue</item>
        <item name="colorPrimaryDark">@color/dark_blue</item>
    </style>

    <style name="RedTheme" parent="AppTheme.Base">
        <item name="colorPrimary">@color/red</item>
        <item name="colorPrimaryDark">@color/dark_red</item>
    </style>

</resources>

当我在清单中为我的整个应用指定BlueTheme时,不使用蓝色。

如何针对不同的样式为colorPrimarycolorPrimaryDark等指定不同的值?

如果这不可能,有什么办法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

一些方法:

  1. 您可以在清单中为每个活动设置主题:

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/RedAppTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".SecondActivity"
        android:label="@string/title_activity_second"
        android:theme="@style/BlueAppTheme">
    </activity>
    
  2. 您可以使用setTheme(R.style.yourTheme)通过java设置主题:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        setTheme(R.style.BlueAppTheme);
    
        setContentView(R.layout.activity_main);
    }
    
  3. 检查setTheme是否在setContentView之前,如果不是应用程序崩溃。

    如果您希望用户选择一个主题,您可以使用 sharedpreferences 来存储int值并在switch中使用setTheme。

答案 1 :(得分:0)

嗨,这是我认为正常工作的xml值的部分:

colors.xml:

<resources>
    <color name="primary">#ffd180</color>
    <color name="primary_dark">#ff9100</color>
    <color name="accent">#ff6d00</color>
</resources>

styles.xml:

<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:actionBarStyle">@style/ActionBar</item>
    </style>

    <style name="ActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">@color/primary</item>
    </style>

</resources>

V21 / styles.xml:

<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primary_dark</item>
        <item name="colorAccent">@color/accent</item>
    </style>

</resources>

这可以正确处理api 21+的原色和重点。另外你可以看到我在@color/primary中强行使用styles.xml而这是因为年龄较大的Apis不能以及其他方式使用colorPrimary ; t知道{{1}}项目的含义。

来自Android人员的更多内容[在他们的网站上Maintaining Compatibility,你只需知道:

  

注意:如果您的应用使用了素材主题但未提供   以这种方式替代主题,您的应用程序将无法在版本上运行   Android早于5.0。

以及其他一些细节