以编程方式获取主题颜色

16

我正在开发一个应用,使用自定义的ImageView来显示一张图片,并在其上放置一个边框。

目前边框的颜色是固定的黄色,但我认为如果能匹配系统按下按钮的颜色,比如Droid为橙色,Evo为绿色,Galaxy S为蓝色,那么效果会更好。

我查看了一些API文档,但没找到如何以编程方式获取这种颜色的方法。您有什么想法吗?


这是一个好问题,但恐怕没有解决方案。真的很遗憾。 - mad
自从这个问题被提出已经过去了5年...当前的答案现在在这里:https://dev59.com/6Gct5IYBdhLWcg3wEJYm(第一个答案绝对有效...) - pbristow
3个回答

8
你可以查看Android的themes.xml, styles.xml, 和 colors.xml源代码。从colors.xml中可以注意到没有定义很多颜色,这是因为大部分小部件都是通过9-patch文件完成的。
按钮样式:
 223     <style name="Widget.Button">
 224         <item name="android:background">@android:drawable/btn_default</item>
 225         <item name="android:focusable">true</item>
 226         <item name="android:clickable">true</item>
 227         <item name="android:textAppearance">?android:attr/textAppearanceSmallInverse</item>
 228         <item name="android:textColor">@android:color/primary_text_light</item>
 229         <item name="android:gravity">center_vertical|center_horizontal</item>
 230     </style>

所有更改背景颜色的工作都在btn_defaultDrawable中完成。 < p > btn_default.xml源代码:

  17 <selector xmlns:android="http://schemas.android.com/apk/res/android">
  18     <item android:state_window_focused="false" android:state_enabled="true"
  19         android:drawable="@drawable/btn_default_normal" />
  20     <item android:state_window_focused="false" android:state_enabled="false"
  21         android:drawable="@drawable/btn_default_normal_disable" />
  22     <item android:state_pressed="true" 
  23         android:drawable="@drawable/btn_default_pressed" />
  24     <item android:state_focused="true" android:state_enabled="true"
  25         android:drawable="@drawable/btn_default_selected" />
  26     <item android:state_enabled="true"
  27         android:drawable="@drawable/btn_default_normal" />
  28     <item android:state_focused="true"
  29         android:drawable="@drawable/btn_default_normal_disable_focused" />
  30     <item
  31          android:drawable="@drawable/btn_default_normal_disable" />
  32 </selector>

每个文件都是一个9-patch文件。问题在于这些是png文件。颜色被构建到图像文件中,没有任何定义。正如你所注意到的,这些图像可以被替换,外观会发生变化。
不幸的是,你想要的不可能实现。你必须选择一个单一的颜色。这个颜色可能应该根据你的应用程序的其他部分来选择。抱歉 :(

那真是令人沮丧。不过还是谢谢你。 - infinitypanda

8
从Android ICE_CREAM_SANDWICH (API 14)开始,你可以在android.R.color.*中使用主题颜色。
例如:
myTextView.setTextColor(getResources().getColor(android.R.color.holo_red_light));

1
在我有限的理解中,从android.R.color获得的颜色是静态的颜色,而不是应用程序主题(可以在运行时更改)的可变颜色。这样做的答案在这里:https://dev59.com/6Gct5IYBdhLWcg3wEJYm - pbristow

1

请查看此链接:使用平台样式和主题

我不确定在这种情况下是否应该使用子类化。 我建议尝试以下方法:

  • 使用ImageButton而不是子类化。
  • 将平台样式添加到按钮中。

2
我看过了,但并没有什么帮助。它告诉我如何设置主题,但我想获取主题。而ImageButton不是我要找的,抱歉。图片不需要可点击,我只想使用与按钮相同的颜色。 - infinitypanda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接