【问题标题】:Use appropriate colors irrespective of themes无论主题如何,都使用适当的颜色
【发布时间】:2013-08-02 22:23:22
【问题描述】:

我希望我的活动有两个可能的主题,例如 Theme_HoloTheme_Holo_Light,由用户选择。我需要在这个活动中以编程方式绘制水平分隔线之类的东西。分隔线的颜色应取决于所选主题。我怎样才能轻松做到这一点?

理想情况下,无论使用什么主题,分隔线的标准颜色都应该有一个名称,并且该颜色名称的实际 RGB 实现会自动匹配所选主题。有这种事吗?在我看来,程序员不太可能需要对 RBG 值进行硬编码。

当然,分隔符只是一个例子。我还想以不依赖于主题的方式命名 EditText 或其他小部件的颜色。

【问题讨论】:

  • 研究创建自定义主题,例如,您可以创建两个主题,一个是深色,一个是浅色,然后使用 @android:color/...为每个主题定义分隔线的颜色...
  • 我的问题与使用预定义主题有关,而不是创建它们。有以下关键区别:如果我创建一个主题,我决定它的所有颜色。如果我使用像 Holo 这样的预定义它们,例如分隔线颜色的名称是什么?
  • 换一种说法:如果我喜欢 Gmail 应用的分隔线颜色,我该如何访问它?
  • 不能确定,但​​看起来像 android:color/lighter_gray 或 android:color/darker_gray github.com/android/platform_frameworks_base/blob/master/core/…
  • 令我困惑的是,关于这方面的信息有多么少。 Google 不希望 Android 应用具有统一的外观吗?

标签: android colors themes


【解决方案1】:

在你的Activity的onCreate()方法中,在调用setContentView()之前,使用this.setTheme(customTheme)设置主题;

或者试试看,Using Themes in Android Applications

【讨论】:

    【解决方案2】:

    您可以创建自己的主题属性并在应用的主题中使用它们,并允许用户在应用的主题之间切换。

    首先,在/res/values文件夹中创建一个名为attrs.xml的文件并定义一些主题属性:

    <resources>
        <attr name="myDividerColor" format="color" />
    </resources>
    

    接下来,在您的 /res/values/styles.xml 中创建两个主题(如果您分别创建主题和样式,则在 /res/values/themes.xml 中)。一个主题扩展了 Android 的深色主题,一个扩展了 Android 的浅色主题。将您的自定义属性添加到您的主题中:

    <resources>
        <!-- Dark theme -->
        <style name="AppTheme_Dark" parent="@android:Theme.Holo">
            ...
            <item name="myDividerColor">@color/divider_dark</item>
        </style>
    
        <!-- Light theme. -->
        <style name="AppTheme_Light" parent="@android:Theme.Holo.Light">
            ...
            <item name="myDividerColor">@color/divider_light</item>
        </style>
    </resources>
    

    请注意,我使用了name="myDividerColor"不是 android:name="myDividerColor"

    最后,在您的 Activity 代码中,您可以获得如下颜色:

    // the attrs you want
    int[] attrs = {R.attr.myDividerColor};
    // get attr values for the current theme
    TypedArray a = obtainStyledAttributes(attrs);
    // first arg is the index of the array, in same order as attrs array above
    // second arg is a default value (if not defined or not a resource) 
    int dividerColor = a.getColor(0, Color.TRANSPARENT);
    

    【讨论】:

    • 谢谢。但是,这并不能回答我的问题。这解释了如何使用您自己的主题。我想知道如何使用预定义主题:预定义主题中的哪些小部件使用哪些颜色
    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 2014-04-07
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多