Программно измените значение цветового ресурса, полученного из ответа API

допустим, на моем вызове API у меня есть параметр, который называется color. Можно ли редактировать или изменять существующий R.colors.color назначить цвет из результата API?

пример:

я делаю вызов моему API, и он возвращает green, теперь я хочу загрузить свое приложение с i.e (зеленый Toolbar, зеленый TextView цвет, etc.), возможно ли это?

моей первой мыслью было:

создать элемент на colors.xml под названием demo затем назначьте ему цвет по умолчанию, затем используйте это demo цвет везде, где я хочу (Button, TextView, etc.) Тогда я подумал, что можно было бы изменить это значение программно с результатом API, поэтому мне не нужно было бы создавать SharedPreferences или что-то в этом роде и для избежания большего кода.

As @Ю. С. сказал

к сожалению, вам придется установить цвет текста или просмотра вручную везде ... :(

I хотелось бы, если есть другой способ сделать это, так как я не знаю, сколько Activities мой проект будет содержать, так что если есть другой способ сделать это, я рад услышать другие предположения.

редактировать

я пытаюсь ответить @Jared Rummler, и, возможно, я делаю что-то неправильно... Я создал простой Json и я ставлю на свои активы я разбираю Json и я поставил его на GlobalConstant затем я сделал "простое приложение".

прежде всего у меня есть TextView и Button что содержит "your_special_color", и возврат его я ставлю GlobalConstant int следующим образом :

case "your_special_color":                
            return GlobalConstant.color; 

тогда то, что я попробовал, - мой первый Activity и 1 TextView и 1 Button как я уже говорил, и у них есть цвет "your_special_color", что я не хочу его менять, но у меня есть Intent на Button открыть другой Activity, который содержит то же самое, но с GlobalConstant.color и это не изменить.

я попробовал это сделать (мой второй Активность):

public class Main2Activity extends AppCompatActivity {
private Res res;
@Override public Resources getResources() {
    if (res == null) {
        res = new Res(super.getResources());
    }
    return res;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

я что-то пропустил?

Ох.. Я понял, что я думаю, делает это на моем MainActivity2 ?

 Button btn = (Button)findViewById(R.id.button2);
 btn.setBackgroundColor(res.getColor(R.color.your_special_color));

5 ответов


если вы посмотрите на Доступ К Ресурсам документ, вот что он говорит ...

как только вы предоставите ресурс в своем приложении, вы можете применить его, сославшись на его идентификатор ресурса. Все идентификаторы ресурсов определены вR класс, который aapt инструмент автоматически генерирует.

кроме того,

когда приложение составлен, aapt создает R класс, который содержит идентификаторы ресурсов для всех ресурсов res/ справочник. Для каждого типа ресурса существует R подкласс (для пример,R.drawable для всех привлекаемых ресурсов), и для каждого ресурс такого типа, существует статическое целое число (например, R.drawable.icon). Это целое число-идентификатор ресурса, который можно использовать чтобы получить ваш ресурс.

то, что это говорит, по сути, это почти все держится как ресурс на res/ каталог компилируется и ссылается как неизменяемая константа. Именно по этой причине значения элементов ресурсов не могут быть изменены программно / во время выполнения, потому что они составлен. В отличие от локальных / глобальных переменных & SharedPreferences элементы ресурсов представлены в памяти программы, как стационарные, неизменные объекты. Они хранятся в специальной области памяти программы, доступной только для чтения. В этом Смотрите также изменение значения R. String программно.

что ты can do is, чтобы избежать использования одного и того же кода в тысяче мест в вашем проекте, создайте общую функцию, которая изменяет значение цвета в SharedPreferences и используйте этот метод везде. Я уверен, что вы уже знали об этом.

чтобы уменьшить количество кода, который нужно добавить в проект, есть альтернатива. Ранее использовал библиотека каллиграфии что позволило мне исправить стиль шрифта и цвет по всему приложению. Это может быть полезно для вас, проверьте это ...


вы можете создать класс, который расширяет Resources и переопределить методы getColor(int) и getColor(int, Theme).

пример:

цвета.в XML

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="your_special_color">#FF0099CC</color>
</resources>

Res.java

public class Res extends Resources {

    public Res(Resources original) {
        super(original.getAssets(), original.getDisplayMetrics(), original.getConfiguration());
    }

    @Override public int getColor(int id) throws NotFoundException {
        return getColor(id, null);
    }

    @Override public int getColor(int id, Theme theme) throws NotFoundException {
        switch (getResourceEntryName(id)) {
            case "your_special_color":
                // You can change the return value to an instance field that loads from SharedPreferences.
                return Color.RED; // used as an example. Change as needed.
            default:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    return super.getColor(id, theme);
                }
                return super.getColor(id);
        }
    }
}

BaseActivity.java

public class BaseActivity extends AppCompatActivity {

    ...

    private Res res;

    @Override public Resources getResources() {
        if (res == null) {
            res = new Res(super.getResources());
        }
        return res;
    }

    ...

}

это подход, который я использовал в одном из моих приложений,Root Проверка. Если вы переопределите getResources в вашей деятельности и классе основного приложения вы можете изменить тема программно (хотя темы неизменяемы). Если вы хотите, загрузите приложение и посмотрите, как вы можете установить основные, акцентные и фоновые цвета из настроек.


R класс не должен редактироваться. Он просто содержит ссылки на ваши ресурсы.

вам нужно будет установить его вручную. Однако, чтобы уменьшить нагрузку на настройку вручную, вы можете попробовать использовать специальные библиотеки для сохранения предпочтений, например:

(полный список подобных библиотек https://android-arsenal.com/tag/75)


кроме того, вы можете подумать о другом способе применения стилей и передачи параметров - подумайте, что вы хотите добавить некоторые другие параметры, такие как высота, ширина и т. д. Для этого можно определить пользовательский атрибут в темах.XML и стили.XML-код:

<attr name="demoColor" format="reference|color" />

затем определите стили:

<style name="BaseActivity">
</style>
<style name="GreenActivity" parent="@style/BaseActivity">
    <item name="demoColor">#00cd00</item>
</style>
<style name="RedActivity" parent="@style/BaseActivity">
    <item name="demoColor">#ff0000</item>
</style>

затем используйте этот цвет в своем xml следующим образом:

... android:background="?demoColor" ...

и переключаться между GreenActivity и RedActivity стили Activity.onCreate:

setTheme(isGreenStyle() ? R.style.GreenActivity : R.style.RedActivity)
setContentView(...)

С выше подход, вы сможете легко настроить свои стили в XML и он должен быть меньше кода и проще рефакторинг в будущем. (Вам все равно нужно будет иметь одну переменную, чтобы сохранить, есть ли у вас зеленый или красный стиль)


другой способ, если вы хотите показать демо вашего приложения с разными цветами, чтобы использовать варианты сборки / вкусы для загрузки приложения с различными цветами и стилями (это для времени сборки-не время выполнения):

app/src/main/res/цвета.в XML

<resources>
    <color name="demoColor">#00cd00</color>
</resources>

app / src/buildVariant/res / цвета.в XML

<resources>
    <color name="demoColor">#ff0000</color>
</resources>

теперь вы можете быстро переключаться между "main" и "buildVariant" в меню вариантов сборки и запускать приложение с различными цветами "demo". Точно так же вы можете настроить множество других атрибутов.

поиск "вариантов сборки" здесь http://developer.android.com/tools/building/configuring-gradle.html


вы не можете изменить ресурсы приложения, все они являются константами. Вместо этого вы можете сохранить свой цвет в SharedPrefences и использовать цвет оттуда.

посмотреть как использовать SharedPreferences в Android для хранения, извлечения и редактирования значений.

Если ваше приложение уже имеет цвет Р..зеленый определен, и вы просто хотите получить к нему доступ на основе того, что API вернул вам:

int resourceID = getResources().getIdentifier("green", "color", getPackageName());

хранить шестнадцатеричные цветовые коды в sharedpreferences, а затем использовать функцию parsecolor хранить все шестнадцатеричные цвета в сеансах в виде строки и всякий раз ,когда вы хотите изменить цвет пертикулярной кнопки, textview..просто повторите этот цветовой код из сеанса и используйте его как
для экс.
session.setString("white","#FFFFFF"); String colorname=session.getString("white");yourtextview.setBackgroundColor(Color.parseColor(colorname);