以编程方式更改图像颜色 Android
Changing Color of Image programmatically Android
我知道有几个答案,但我试过了都没有成功。我有以前工作的代码,当使用 color.xml
文件中的预定义资源颜色加载时,它会更改图标的颜色。对于不同的口味,我有不同的 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 是否也使用它来构建调试版本?
我尝试了多种不同的方法来加载图标颜色,但都没有成功。我还尝试在调用 setColorFilter
之前添加 .getDrawable()
。遗憾的是很难调试,因为在 Android Studio 中它可以工作 - 只有当我生成实际的 APK 时它才会失败。
答案是上面的代码没问题。问题出在 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);
}
我知道有几个答案,但我试过了都没有成功。我有以前工作的代码,当使用 color.xml
文件中的预定义资源颜色加载时,它会更改图标的颜色。对于不同的口味,我有不同的 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 是否也使用它来构建调试版本?
我尝试了多种不同的方法来加载图标颜色,但都没有成功。我还尝试在调用 setColorFilter
之前添加 .getDrawable()
。遗憾的是很难调试,因为在 Android Studio 中它可以工作 - 只有当我生成实际的 APK 时它才会失败。
答案是上面的代码没问题。问题出在 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);
}