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

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

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

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

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

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

Как @YS сказал мне

К сожалению, вам придется устанавливать цвет текста или просматривать вручную везде … 🙁

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

РЕДАКТИРОВАТЬ

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

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

 case "your_special_color": return GlobalConstant.color; 

Тогда, что я попробовал, это моя первая Activity у меня есть 1 TextView и 1 Button как я уже говорил, и у них есть цвет «your_special_color», который я не хочу менять, но у меня есть Intent на моей Button чтобы открыть другое действие, которое содержит то же самое, но с 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)); 

Если вы посмотрите документ Accessing Resources , то, что он говорит, это …

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

Более того,

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

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

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

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

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

Пример:

colors.xml

   #FF0099CC  

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

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

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

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


Кроме того, вам может понадобиться подумать о другом способе применения стилей и параметрах передачи – подумайте, что вы хотели бы добавить некоторые другие параметры, такие как высота, ширина и т. Д. С этой целью вы можете определить собственный атрибут в topic.xml / styles.xml:

  

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

    

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

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

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

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

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


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

приложение / SRC / основные / RES / colors.xml

  #00cd00  

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

  #ff0000  

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

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

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

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

Если у вашего приложения уже определен R.color.green, и вы просто хотите получить к нему доступ в зависимости от того, какой 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);

  • Доступ к ресурсам JAR
  • Утечка ресурсов: «in» никогда не закрывается
  • Чтение файла ресурсов изнутри банки
  • Что такое библиотека ресурсов JSF и как ее использовать?
  • Предпочтительный способ загрузки ресурсов в Java
  • Какая самая влиятельная книга, которую должен прочитать каждый программист?
  • Вставить текстовый файл в ресурс в собственном приложении Windows
  • Файл с сырым исходным текстом для Android
  • Изменять значение R.string программно
  • Android: альтернативный макет xml для ландшафтного режима
  • Spring: обслуживание статических ресурсов вне контекста root
  • Interesting Posts

    Как очистить кеш Android

    Что означает символ M в десятичной литературе C #?

    Можно ли заставить CMake создавать статическую и общую версию одной и той же библиотеки?

    Добавить пользовательский шрифт для полного приложения для Android

    Как объединить значения из нескольких строк в одну строку в Excel?

    Экран камеры / предварительный просмотр в полноэкранном режиме не поддерживает соотношение сторон – изображение искажено, растягивается, чтобы поместиться на экране

    Создать образ ISO текущей системы Windows 7?

    Определение категорий для протоколов в Objective-C?

    Как заставить Time Machine снова работать после смены жесткого диска?

    Как зарегистрировать DLL-файл .NET в GAC?

    Перемещение ПК с одного жесткого диска на другой?

    В чем разница между% и %% в файле cmd?

    копирование свободного рисования с панели в visual studio 2013

    Как использовать sudo с псевдонимом в zsh?

    Как создать динамический «в (…)» sql-список через Spring JdbcTemplate?

    Давайте будем гением компьютера.