Переопределите «style.xml» для программного изменения цвета в Android - PullRequest
0 голосов
/ 02 июля 2019

Как видно из названия, мне нужно изменить цвета макетов Android по своему вкусу. Я прекрасно знаю, что они являются статическими переменными, но, как вы увидите из кода, я пытаюсь переопределить введенные значения, но, даже если это значение найдено, оно не обновляется и не изменяется. Утилита класса является лишь примером.

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.os.Build;


public class ResUtils extends Resources {


private Context context;

public ResUtils(Resources original, Context context) {
    super(original.getAssets(), original.getDisplayMetrics(), original.getConfiguration());
    this.context = context;
}


@Override
public int getColor(int id) throws NotFoundException {
    int color = getColor(id, context.getTheme());
    return color;
}

@Override
public int getColor(int id, Theme theme) throws NotFoundException {
    int example = Color.MAGENTA;
    int retColor = 0;
    if (example != 0) {
        switch (getResourceEntryName(id)) {
            case "colorPrimary":
                retColor = example;
                return retColor;
            default:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    retColor = super.getColor(id, theme);
                    return retColor;
                } else {
                    retColor = super.getColor(id);
                    return retColor;
                }

        }
    } else {
        retColor = super.getColor(id, theme);
    }
    return retColor;
    }
}

Я добавляю этот код в MainActivity:

private ResUtils res;

    @Override
    public ResUtils getResources() {
        if (res == null) {
            res = new ResUtils(super.getResources(), getApplicationContext());
        }
        return res;
    }
}

Это моя тема:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">#E20612</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

А это простая раскладка:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <corners
        android:radius="20px"/>
    <stroke
        android:width="2px"
        android:color="?colorPrimary">
    </stroke>
    <solid
        android:color="?colorPrimary"/>
</shape>

Я хочу обновить свой 'colorPrimary' в MAGENTA (для этого случая) ... но ничего не меняется!

...