如何将字符串颜色更改为颜色资源?

4
我想更改页眉背景颜色,我正在使用MaterialDrawer库:
   AccountHeader headerResult = new AccountHeaderBuilder()
            .withActivity(this)                   
  .withHeaderBackground(Color.parseColor(mPrefs.getString("theme_color",getResources().getString(R.string.default_color)))
  .withSelectionListEnabledForSingleProfile(false)
            ... and so on 

但是当设置头部背景时,我遇到了错误消息“期望一个颜色资源id(R.color.)但接收到了RGB整数”,无法从首选项中读取背景颜色。日志上给出错误:"android.content.res.Resources$NotFoundException: Resource ID #0x2e60e8"


根据错误提示 withHeaderBackground 需要资源ID(例如 R.id.someColor),但你传递的是HEX代码。这就是为什么会出现该错误。你是如何在偏好设置中保存颜色的? - V-rund Puro-hit
我从服务器收到了十六进制颜色代码,然后想要更改我的页眉的背景颜色。 - Karishma Patel
你的颜色是以整数格式表示的,对吗? - Rohit Singh
我从服务器获取到一个十六进制颜色代码,它是一个字符串。 - Karishma Patel
6个回答

1
从您的字符串中创建ColorDrawable,然后将其设置为标题。
int col = Color.parseColor(mPrefs.getString("theme_color",getResources().getString(R.string.default_color)));
ColorDrawable cd = new ColorDrawable();
cd.setColor(col);

headerResult = new AccountHeaderBuilder()
            .withActivity(this)
            .withCompactStyle(false)
            .withHeaderBackground(cd)
            .withSavedInstance(savedInstanceState)
            .build();

如果您直接将 #FF6666 传递给 Color.parseColor(),它是否可行? - karan
是的,我已经检查过了,它返回了远程设置的十六进制颜色代码值。 - Karishma Patel
@KarishmaPatel:请检查更新后的答案,它应该按照您的期望工作。 - karan
由于它正在返回值,我已相应地更新了答案,请检查是否允许您设置颜色。 - karan
仍未更新颜色.. 我正在使用最新版本的库。 - Karishma Patel
显示剩余6条评论

0

将颜色的 HEX 代码保存在 colors.xml 中,如下所示: #AABBEE(在此处使用颜色的十六进制代码) 然后,设置背景:

  .withHeaderBackground(R.color.myColor)
  .withSelectionListEnabledForSingleProfile(false)
  ....

我想使用字符串颜色资源,而不是从color.xml文件中获取颜色代码。 - Karishma Patel

0

首先,在问题中应该提到您正在使用MaterialDrawer库,因为AccountHeader不是标准Android SDK的一部分。

话虽如此,检查repo中AccountHeaderBuilder的源代码显示,withHeaderBackground方法有3个变体,分别采用Drawable@DrawableRes intImageHolder

如果您坚持从strings.xml加载颜色,则我认为以下方法可以解决:

使用您的字符串创建一个ColorDrawable,格式应为0xAARRGGBB

由于ColorDrawable类扩展了Drawable,因此它应该是withHeaderBackground方法的有效参数。您的代码将如下所示:

ColorDrawable cd = new ColorDrawable(getResources().getString(R.string.default_color));

AccountHeader headerResult = new AccountHeaderBuilder()
            .withActivity(this)                   
  .withHeaderBackground(cd)
  .withSelectionListEnabledForSingleProfile(false)
            ... and so on 

一个更简单的方法是只需拥有一个drawable资源,并将其用作R.drawable.default_drawable

以上代码无法运行,出现错误:android.content.res.Resources$NotFoundException: Resource ID #0x2e60e8。 - Karishma Patel
嗯,这是根据您提供的示例代码编写的。请确保在strings.xml中有一个ID为“default_color”的字符串。如果您从服务器获取字符串,正如您在上面的评论中提到的那样,那么您的xml文件中就不会有任何内容。您需要传递该字符串,以代替getResource().getString(R.string.default_color) - shriakhilc

0

Color.parseColor() 方法解析颜色字符串,并返回相应的 颜色整型值,这个整型值与 资源 ID 不同,即使两个值都是 int 类型。

你可以像这样使用:

int colorID =
    getResourceID("your_color_name", "color", getApplicationContext());

不需要使用 Color.parseColor() 方法。


0

你正在使用的 withHeaderBackground() 的签名是这样的:

public AccountHeaderBuilder withHeaderBackground(@DrawableRes int headerBackgroundRes)

但是您正在传递某个颜色的int值。
您需要一个颜色或可绘制资源ID。


-1

你可以用两个步骤完成这个操作

假设你有一个颜色 #8080000

1. 首先将你的十六进制转换为整数

int yourColor = Color.parseColor("#808000");

2. 设置背景

.setBackgroundColor(context.getColor(yourColor));

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