【问题标题】:Changing colors of drawables in Android在 Android 中更改可绘制对象的颜色
【发布时间】:2021-07-05 05:06:32
【问题描述】:

我已经制作了一个函数来更改 android 中可绘制对象的颜色。问题是它只有 60-70% 的时间有效。我在我的应用程序的每个活动的 onCreate 方法上调用它。 (颜色保存在共享首选项中) As you can see in this image the color of the background drawable did not change 它工作得很好。但有时在一个奇怪的活动中,只有一些可绘制对象的颜色发生了变化,而其他的则保留了它们的默认颜色。 这是函数的代码:

 public static void changeTheme(Context context) {
    int color = Color.parseColor(AppUtils.getColorSharedPreference(context, AppConstants.customCOLOR));
    if (color != -1) {
        Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.ic_untitled_4);
        Drawable wrappedDrawable = null;
        if (unwrappedDrawable != null) {
            wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
        }
        Drawable unwrappedDrawableExit = AppCompatResources.getDrawable(context, R.drawable.logout_img);
        Drawable wrappedDrawableExit = null;
        if (unwrappedDrawableExit != null) {
            wrappedDrawableExit = DrawableCompat.wrap(unwrappedDrawableExit);
        }
        Drawable unwrappedDrawableFocus = AppCompatResources.getDrawable(context, R.drawable.focus_img);
        Drawable wrappedDrawableFocus = null;
        if (unwrappedDrawableFocus != null) {
            wrappedDrawableFocus = DrawableCompat.wrap(unwrappedDrawableFocus);
        }
        Drawable unwrappedDrawableSettings = AppCompatResources.getDrawable(context, R.drawable.settings_img);
        Drawable wrappedDrawableSettings = null;
        if (unwrappedDrawableSettings != null) {
            wrappedDrawableSettings = DrawableCompat.wrap(unwrappedDrawableSettings);
        }
        Drawable unwrappedDrawableHome = AppCompatResources.getDrawable(context, R.drawable.home_img);
        Drawable wrappedDrawableHome = null;
        if (unwrappedDrawableHome != null) {
            wrappedDrawableHome = DrawableCompat.wrap(unwrappedDrawableHome);
        }
        Drawable unwrappedDrawableBackArrow = AppCompatResources.getDrawable(context, R.drawable.arrow);
        Drawable wrappedDrawableBackArrow = null;
        if (unwrappedDrawableBackArrow != null) {
            wrappedDrawableBackArrow = DrawableCompat.wrap(unwrappedDrawableBackArrow);
        }
        Drawable unwrappedDrawableUnknownUser = AppCompatResources.getDrawable(context, R.drawable.unknown_user);
        Drawable wrappedDrawableUnknownUser = null;
        if (unwrappedDrawableUnknownUser != null) {
            wrappedDrawableUnknownUser = DrawableCompat.wrap(unwrappedDrawableUnknownUser);
        }
        Drawable unwrappedDrawableVerified = AppCompatResources.getDrawable(context, R.drawable.verified_user);
        Drawable wrappedDrawableVerified = null;
        if (unwrappedDrawableVerified != null) {
            wrappedDrawableVerified = DrawableCompat.wrap(unwrappedDrawableVerified);
        }
        Drawable unwrappedDrawableNoFace = AppCompatResources.getDrawable(context, R.drawable.no_face_detected);
        Drawable wrappedDrawableNoFace = null;
        if (unwrappedDrawableNoFace != null) {
            wrappedDrawableNoFace = DrawableCompat.wrap(unwrappedDrawableNoFace);
        }
        Drawable unwrappedDrawableWarning = AppCompatResources.getDrawable(context, R.drawable.warning);
        Drawable wrappedDrawableWarning = null;
        if (unwrappedDrawableWarning != null) {
            wrappedDrawableWarning = DrawableCompat.wrap(unwrappedDrawableWarning);
        }
        Drawable unwrappedDrawableMessage = AppCompatResources.getDrawable(context, R.drawable.message_new);
        Drawable wrappedDrawableMessage = null;
        if (unwrappedDrawableMessage != null) {
            wrappedDrawableMessage = DrawableCompat.wrap(unwrappedDrawableMessage);
        }
        DrawableCompat.setTintList(wrappedDrawable, ColorStateList.valueOf(color));
        DrawableCompat.setTintList(wrappedDrawableBackArrow, ColorStateList.valueOf(color));
        DrawableCompat.setTintList(wrappedDrawableExit, ColorStateList.valueOf(color));
        DrawableCompat.setTintList(wrappedDrawableHome, ColorStateList.valueOf(color));
        DrawableCompat.setTintList(wrappedDrawableSettings, ColorStateList.valueOf(color));
        DrawableCompat.setTintList(wrappedDrawableFocus, ColorStateList.valueOf(color));
        DrawableCompat.setTintList(wrappedDrawableUnknownUser, ColorStateList.valueOf(color));
        DrawableCompat.setTintList(wrappedDrawableVerified, ColorStateList.valueOf(color));
        DrawableCompat.setTintList(wrappedDrawableNoFace, ColorStateList.valueOf(color));
        if (wrappedDrawableWarning != null) {
            DrawableCompat.setTintList(wrappedDrawableWarning, ColorStateList.valueOf(color));
        }
        if (wrappedDrawableMessage != null) {
            DrawableCompat.setTintList(wrappedDrawableMessage, ColorStateList.valueOf(color));
        }

    }
}

这是一个示例调用:

 if(Color.parseColor(AppUtils.getColorSharedPreference(LoginActivity.this,AppConstants.customCOLOR))!=-1)
    {
        AppUtils.changeTheme(LoginActivity.this);
    }

【问题讨论】:

  • “正如您在这张图片中看到的,背景可绘制对象的颜色没有改变” - 我什至无法区分哪个是背景,哪一个是前景。你到底想换什么颜色?
  • 弯曲的三角形是可绘制的(背景的一部分具有默认颜色),而按钮和编辑文本是前景的一部分(它们的颜色已经改变。)

标签: java android user-interface xml-drawable


【解决方案1】:

你可以试试这个?

Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.my_drawable); 
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, Color.RED);  

【讨论】:

  • 调试并检查 if(Color.parseColor(AppUtils.getColorSharedPreference(LoginActivity.this,AppConstants.customCOLOR))!=-1) 这个条件
【解决方案2】:

好的,我发现了真正的问题。 这个方法需要在super.onCreate()之前调用;

【讨论】: