Programmatically change the value of a color resource obtained from API response
If you take a look at the Accessing Resources document, what it says is that ...
Once you provide a resource in your application, you can apply it by referencing its resource ID. All resource IDs are defined in your project's
R
class, which theaapt
tool automatically generates.
Furthermore,
When your application is compiled,
aapt
generates theR
class,
which contains resource IDs for all the resources in yourres/
directory. For each type of resource, there is anR
subclass (for
example,R.drawable
for all drawable resources), and for each
resource of that type, there is a static integer (for example,
R.drawable.icon
). This integer is the resource ID that you can use
to retrieve your resource.
What this is saying, essentially, is that pretty much everything held as a resource in the res/
directory is compiled and referenced as an unchangeable constant. It is for this reason that the values of resource elements cannot be changed programmatically/at runtime, because they are compiled. As opposed to local/global variables & SharedPreferences
, resource elements are represented in program memory as fixed, unchangeable objects. They are held in a special read-only region of program memory. In this regard, see also Changing value of R.String Programmatically.
What you can do is, to avoid using the same code at a thousand places in your project, create a common function that changes the value of the color in the SharedPreferences
and use this method everywhere. I'm sure you knew this already, of course.
To reduce the amount of code you need to add to the project, there is an alternative. I have previously used the calligraphy library which allowed me to fix the font style & color throughout the app. This may be of some good use to you, check it out ...
Android Change Color Resource Value Programmatically
The R file contains constants, you cant change them at runtime because you can't normally change constants at run time. If you want to update the color of all textviews why dont you look into themes. Create a custom theme and then change the theme when activity loads in onCreate. After you set the new theme i think your going to have to call setContentView again and then call all your findViewByIds again as they will be null. You could also try Calling recreate() after setTheme(). This sounds messy.
Maybe this can help you change the theme.
Get color value programmatically when it's a reference (theme)
This should do the job:
TypedValue typedValue = new TypedValue();
Theme theme = context.getTheme();
theme.resolveAttribute(R.attr.theme_color, typedValue, true);
@ColorInt int color = typedValue.data;
Also make sure to apply the theme to your Activity before calling this code. Either use:
android:theme="@style/Theme.BlueTheme"
in your manifest or call (before you call setContentView(int)
):
setTheme(R.style.Theme_BlueTheme)
in onCreate()
.
I've tested it with your values and it worked perfectly.
Programmatically change the value of a color resource obtained from API response
If you take a look at the Accessing Resources document, what it says is that ...
Once you provide a resource in your application, you can apply it by referencing its resource ID. All resource IDs are defined in your project's
R
class, which theaapt
tool automatically generates.
Furthermore,
When your application is compiled,
aapt
generates theR
class,
which contains resource IDs for all the resources in yourres/
directory. For each type of resource, there is anR
subclass (for
example,R.drawable
for all drawable resources), and for each
resource of that type, there is a static integer (for example,
R.drawable.icon
). This integer is the resource ID that you can use
to retrieve your resource.
What this is saying, essentially, is that pretty much everything held as a resource in the res/
directory is compiled and referenced as an unchangeable constant. It is for this reason that the values of resource elements cannot be changed programmatically/at runtime, because they are compiled. As opposed to local/global variables & SharedPreferences
, resource elements are represented in program memory as fixed, unchangeable objects. They are held in a special read-only region of program memory. In this regard, see also Changing value of R.String Programmatically.
What you can do is, to avoid using the same code at a thousand places in your project, create a common function that changes the value of the color in the SharedPreferences
and use this method everywhere. I'm sure you knew this already, of course.
To reduce the amount of code you need to add to the project, there is an alternative. I have previously used the calligraphy library which allowed me to fix the font style & color throughout the app. This may be of some good use to you, check it out ...
How to change a color value in android via java code
You should use themes and styles for changing color values.
See: Styles and Themes
Basically, you should declare the color in styles.xml:
<style name="GreenText" parent="TextAppearance.AppCompat">
<item name="android:textColor">#00FF00</item>
</style>
<style name="RedText" parent="TextAppearance.AppCompat">
<item name="android:textColor">#ff0000</item>
</style>
Then declare which theme to use in onCreate (before setContentView()):
switch (theme) {
case 1:
setTheme(R.style.Green);
break;
case 2:
setTheme(R.style.Red);
break;
}
Edit:
You can change the theme during onCreate() only - If you want to change it afterwards, during runtime, you will have to recreate your activity by calling recreate()
Related Topics
Update Ui from Thread in Android
Passing Data Between Activities in Android
Android: I Lost My Android Key Store, What Should I Do
Keyboard Showed Messed Up Elements' Position
CSS - Sibling Selector Not Working in Android
Update an Android App (Without Google Play Store Visit)
Trusting All Certificates with Okhttp
Scale Image to Fill Imageview Width and Keep Aspect Ratio
How Does the Mapping Between Android Resources and Resources Id Work
Linearlayout Not Expanding Inside a Scrollview
How to Create a Http Server in Android
Dialog to Pick Image from Gallery or from Camera
Android Failed to Load Js Bundle
Android Viewpager as Image Slide Gallery