Подтвердить что ты не робот

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

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

В качестве примера:

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

Моя первая мысль была:

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

Как @Y.S. сказал мне

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

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

ИЗМЕНИТЬ

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

Прежде всего, у меня есть TextView и a 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));
4b9b3361

Ответ 1

Если вы посмотрите на "Доступ к ресурсам" , то, что он говорит, это...

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

Кроме того,

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

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

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

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

Ответ 2

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

Пример:

colors.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 Check. Если вы переопределяете getResources в своих действиях и в главном классе приложения, вы можете изменить тему программно (хотя темы неизменяемы). Если вы хотите, загрузите приложение и посмотрите, как вы можете установить основные, акцентные и фоновые цвета из настроек.

Ответ 3

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

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

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


Кроме того, вам может понадобиться подумать о другом способе применения стилей и параметрах передачи - подумайте, что вы хотели бы добавить некоторые другие параметры, такие как высота, ширина и т.д. С этой целью вы можете определить собственный атрибут в theme.xml/styles.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, и в будущем он должен быть меньше кода и проще рефакторировать. (Вам все равно нужно иметь одну переменную, чтобы сохранить, есть ли у вас зеленый или красный стиль)


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

приложение/SRC/главная/Рез/colors.xml

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

Приложение/SRC/buildVariant/Рез/colors.xml

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

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

Найдите "Build Variants" здесь http://developer.android.com/tools/building/configuring-gradle.html

Ответ 4

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

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

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

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

Ответ 5

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