Программно изменить значение цветового ресурса, полученного из ответа API
Скажем, по моему вызову API у меня есть параметр, который называется color
. Можно ли отредактировать или изменить существующий R.colors.color
чтобы назначить цвет из результата API?
В качестве примера:
Я звоню в свой API, и он возвращает green
, теперь я хочу загрузить свое приложение с помощью т. Е. (Зеленая Toolbar
, зеленый цвет TextView
и т. Д.), Возможно ли это?
- Извлечение всех ресурсов Drawable из объекта Resources
- Загрузите ресурс, содержащийся в банке
- Есть ли способ получить исходный код из файла APK?
- Доступ к файлам ресурсов на Android
- Весна 3 Ресурсы MVC и тег
Моя первая мысль была:
Создайте элемент в 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));
- Получить ресурс, используя getResource ()
- Ссылка на ресурс, размещенный в папке WEB-INF в JSP-файле, возвращает HTTP 404 на ресурсе
- Использование папки ресурсов в единстве
- Android: Как получить строку из ресурсов, используя ее имя?
- Как получить доступ к ресурсам в JAR-файле?
- getResourceAsStream возвращает null
- Причина для активов и ресурсов в Android
- В чем разница между StaticResource и DynamicResource в WPF?
Если вы посмотрите документ Accessing Resources , то, что он говорит, это …
После того как вы предоставите ресурс в своем приложении, вы можете применить его, указав его идентификатор ресурса. Все идентификаторы ресурсов определены в classе
R
проекта, который автоматически генерирует инструментaapt
.
Более того,
Когда ваше приложение компилируется ,
aapt
генерирует classR
, который содержит идентификаторы ресурсов для всех ресурсов в вашей папкеres/
. Для каждого типа ресурсов существует подclassR
(например,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
не должен редактироваться. Он просто содержит ссылки на ваши ресурсы.
Вам нужно будет установить его вручную. Однако, чтобы уменьшить нагрузку на его установку вручную, вы можете попробовать использовать специальные библиотеки для сохранения предпочтений, например:
- Sabre – https://github.com/jug6ernaut/saber
- PreferenceBinder – https://github.com/denley/preferencebinder
(полный список похожих библиотек 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);