我知道有几个答案,但我尝试过没有成功。我有以前工作的代码,当使用color.xml
文件中的预定义资源颜色加载时,它会更改图标的颜色。对于不同的Flavors,我有不同的color.xml
文件。我知道color.xml
文件被拾取并用作其他颜色已成功使用。正如我所说,这是以前在Eclipse中运行并使用Ant构建。但是我已经升级了一些库,所以我怀疑某些东西可能已经改变了一个导致这个问题。更奇怪的是,它在调试中耗尽Android Studio时有效,但在使用Gradle
构建时却不行。
这是以前工作的代码(怀疑setColorFilter是罪魁祸首?):
ImageButton btnYes = new ImageButton(mContext);
btnYes.setPadding(0, 15, 15, 15);
btnYes.setTag(1);
Drawable yesDrawable = Utilities.getAndroidDrawable("form_ratingyes", mContext);
btnYes.setImageDrawable(yesDrawable);
btnYes.setFocusableInTouchMode(false);
btnYes.setBackgroundColor(Color.WHITE);
btnYes.setColorFilter(ContextCompat.getColor(mContext,R.color.rating_off));
color.xml文件如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Bullet Icon Color for (Forms, In Progress, Sync and Submitted Status)-->
<color name="bullet">#0378AF</color>
<!-- Navigation Bar Color-->
<color name="navigation_bar">#F68A33</color>
<!-- Menu Icon Color-->
<color name="menu_tint">#F68A33</color>
<color name="form_icons">#F68A33</color>
<!-- Rating Field Button Color -->
<color name="rating_on">#F68A33</color>
<color name="rating_off">#A2AAAD</color>
<!-- Action Button Color -->
<color name="login_button_default">#F68A33</color>
<color name="login_button_selected">#B0540B</color>
</resources>
图像看起来像这样:
基本上是一个带有透明“Y”和外圈的白色圆圈。我们的想法是将白色替换为“rating_on
”颜色。
正确运行时,它应如下所示:
如果嫌疑人是gradle文件,我可以添加它,但Android Studio是否也使用它来构建调试版本?
我尝试了许多不同的方法来加载图标颜色,但都没有成功。我还尝试在调用.getDrawable()
之前添加setColorFilter
。遗憾的是,它很难调试,因为在Android Studio中它可以工作 - 只有当我生成实际的APK时才会失败。
答案 0 :(得分:0)
答案是上面的代码很好。问题出现在Utilities.getAndroidDrawable("form_ratingyes", mContext);
调用的内容中,它看起来像这样:
public static Drawable getAndroidDrawable(String drawableName, Context context){
int resourceId= context.getResources().getIdentifier(drawableName, "drawable", imagepackage);
if(resourceId==0){
return null;
} else {
return ContextCompat.getDrawable(context, resourceId);
}
图像包是:
public final static String imagePackage = "com.mycompany.myapp";
如此明显,但我从未研究过这种方法。对我感到羞耻。 不知何故,在旧的Ant构建中,它包括旧软件包名称下的所有图像(硬编码) - 而不是新的软件包名称。是的有趣的一个调试(不是我的代码所以不知道它在做什么)。
只需要动态调用包:
public static Drawable getAndroidDrawable(String drawableName, Context context){
int resourceId= context.getResources().getIdentifier(drawableName, "drawable", context.getPackageName());
if(resourceId==0){
return null;
} else {
return ContextCompat.getDrawable(context, resourceId);
}