Программно измените значение цветового ресурса, полученного из ответа API
допустим, в моем вызове API у меня есть параметр, который называется color. Можно ли редактировать или изменять существующий R.colors.color чтобы назначить цвет для API?
пример:
я делаю вызов моего API, и он возвращает green, теперь я хочу, чтобы загрузить мое приложение с т. е. (зеленый Toolbar, зеленый TextView цвет, etc.), это возможно?
моей первой мыслью было:
создать элемент на colors.xml под названием demo затем назначьте ему цвет по умолчанию, затем используйте это demo цвет везде, где я хочу (Button,TextView и т. д.) Тогда я подумал, что можно было бы изменить это значение программно с результатом из API, поэтому мне не нужно было бы создавать SharedPreferences или что-то в этом роде и для избежания большего количества кода.
как сказал мне @Y. S.
к сожалению, вам придется установить цвет текста или просматривать вручную везде ... : (
я хотел бы, если есть это другой способ сделать это, так как я не знаю, сколько Activities мой проект будет содержать, так что если есть другой способ сделать это, я рад услышать другие предположения.
EDIT
я пытаюсь ответить на @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инструмент автоматически генерирует.кроме того,
когда приложение compiled,
aaptсоздаетRкласс, который содержит идентификаторы ресурсов для всех ресурсовres/справочник. Для каждого типа ресурса существуетRподкласс (для например,R.drawableдля всех извлекаемых ресурсов), и для каждого ресурс такого типа, есть статическое целое число (например,R.drawable.icon). Это целое число-идентификатор ресурса, который можно использовать чтобы получить свой ресурс.то, что это говорит, по сути, это почти все держится как ресурс на
res/каталог компилируется и ссылается как неизменяемая константа. Именно по этой причине значения элементов ресурсов не могут быть изменены программно/во время выполнения, потому что они compiled. В отличие от локальных / глобальных переменных &SharedPreferencesэлементы ресурсов представлены в памяти программы, как стационарные, неизменные объекты. Они хранятся в специальной области памяти программы, доступной только для чтения. В этом Смотрите также изменение значения R. String программно.что ты можете do это, чтобы избежать использования одного и того же кода в тысяче мест в вашем проекте, создайте общую функцию, которая изменяет значение цвета в
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://github.com/jug6ernaut/saber
- PreferenceBinder - https://github.com/denley/preferencebinder
(полный список подобных библиотек 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 / colors.xml
<resources> <color name="demoColor">#00cd00</color> </resources>app/src/buildVariant/res / colors.xml
<resources> <color name="demoColor">#ff0000</color> </resources>теперь вы можете быстро переключаться между" main "и" buildVariant "в меню вариантов сборки и запускать свое приложение с различными" демонстрационными " цветами. Точно так же вы можете настроить множество других атрибутов.
поиск "вариантов сборки" здесь 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);
Comments