75

I am new to android, and would like to know how do I change the color of font inside the strings.xml file in a string tag.

for example I have:

  <string name="hello_world">Hello world!</string>

I just want it to display as red and blue

thanx

Louis CAD
  • 10,965
  • 2
  • 39
  • 58
Bohrend
  • 1,467
  • 3
  • 17
  • 26

12 Answers12

102

Try this

For red color,

<string name="hello_worldRed"><![CDATA[<b><font color=#FF0000>Hello world!</font></b>]]></string>

For blue,

<string name="hello_worldBlue"><![CDATA[<b><font color=#0000FF>Hello world!</font></b>]]></string>

In java code,

//red color text
TextView redColorTextView = (TextView)findViewById(R.id.redText);
String redString = getResources().getString(R.string.hello_worldRed)
redColorTextView.setText(Html.fromHtml(redString));

//Blue color text
TextView blueColorTextView = (TextView)findViewById(R.id.blueText);
String blueString = getResources().getString(R.string.hello_worldBlue)
blueColorTextView.setText(Html.fromHtml(blueString));
Silambarasan Poonguti
  • 9,386
  • 4
  • 45
  • 38
55

For those who want to put color in String.xml directly and don't want to use color...

example

<string name="status_stop"><font fgcolor='#FF8E8E93'>Stopped</font></string> <!--gray-->
<string name="status_running"><font fgcolor='#FF4CD964'>Running</font></string> <!--green-->
<string name="status_error"><font fgcolor='#FFFF3B30'>Error</font></string> <!--red-->

as you see there is gray, red, and green, there is 8 characters, first two for transparency and other for color.

Example

This a description of color and transparency
#   FF               FF3B30    
    Opacity          Color

Note: Put color in text in the same string.xml will not work in Android 6.0 and above

Table of opacity

100% — FF
99% — FC
98% — FA
97% — F7
96% — F5
95% — F2
94% — F0
93% — ED
92% — EB
91% — E8
90% — E6
89% — E3
88% — E0
87% — DE
86% — DB
85% — D9
84% — D6
83% — D4
82% — D1
81% — CF
80% — CC
79% — C9
78% — C7
77% — C4
76% — C2
75% — BF
74% — BD
73% — BA
72% — B8
71% — B5
70% — B3
69% — B0
68% — AD
67% — AB
66% — A8
65% — A6
64% — A3
63% — A1
62% — 9E
61% — 9C
60% — 99
59% — 96
58% — 94
57% — 91
56% — 8F
55% — 8C
54% — 8A
53% — 87
52% — 85
51% — 82
50% — 80
49% — 7D
48% — 7A
47% — 78
46% — 75
45% — 73
44% — 70
43% — 6E
42% — 6B
41% — 69
40% — 66
39% — 63
38% — 61
37% — 5E
36% — 5C
35% — 59
34% — 57
33% — 54
32% — 52
31% — 4F
30% — 4D
29% — 4A
28% — 47
27% — 45
26% — 42
25% — 40
24% — 3D
23% — 3B
22% — 38
21% — 36
20% — 33
19% — 30
18% — 2E
17% — 2B
16% — 29
15% — 26
14% — 24
13% — 21
12% — 1F
11% — 1C
10% — 1A
9% — 17
8% — 14
7% — 12
6% — 0F
5% — 0D
4% — 0A
3% — 08
2% — 05
1% — 03
0% — 00

Reference: Understanding colors in Android (6 characters)


Update: 10/OCT/2016

This function is compatible with all version of android, I didn't test in android 7.0. Use this function to get color and set in textview

Example format xml in file string and colors

<!-- /res/values/strings.xml -->
<string name="status_stop">Stopped</string>
<string name="status_running">Running</string>
<string name="status_error">Error</string>

<!-- /res/values/colors.xml -->
<color name="status_stop">#8E8E93</color>
<color name="status_running">#4CD964</color>
<color name="status_error">#FF3B30</color>

Function to get color from xml with validation for android 6.0 and above

public static int getColorWrapper(Context context, int id) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//if actual version is >= 6.0
            return context.getColor(id);
        } else {
            //noinspection deprecation
            return context.getResources().getColor(id);
        }
    }

Example:

TextView status = (TextView)findViewById(R.id.tvstatus);
status.setTextColor(getColorWrapper(myactivity.this,R.color.status_stop));

Reference: getColor(int id) deprecated on Android 6.0 Marshmallow (API 23)

Marios
  • 165
  • 1
  • 8
DarckBlezzer
  • 4,578
  • 1
  • 41
  • 51
  • I prefer this method as it doesn't require dynamic loading of the strings and creating an Html. You just set the string to the textview and that's it. Thanks! – stan0 May 15 '18 at 15:06
  • Same as https://developer.android.com/reference/android/support/v4/content/ContextCompat#getcolor – TWiStErRob Oct 20 '18 at 10:16
30

Just add your text between the font tags:

for blue color

<string name="hello_world"><font color='blue'>Hello world!</font></string>

or for red color

<string name="hello_world"><font color='red'>Hello world!</font></string>
farhan patel
  • 1,490
  • 2
  • 19
  • 30
Oscar Duarte
  • 521
  • 5
  • 5
  • 5
    Note that anyone using this approach should use the [Resources.getText(id:)](https://developer.android.com/reference/kotlin/android/content/res/Resources#gettext) method to get the String and not the [Resources.getString(id:)](https://developer.android.com/reference/kotlin/android/content/res/Resources#getstring) method. The former method retains any rich text styling in the String and the latter does not. – Adil Hussain Nov 27 '20 at 17:35
  • 1
    Also, you can use Hex colours just as well as named colours. So `Hello world!` works just as well as `Hello world!`. – Adil Hussain Nov 27 '20 at 17:39
25

If you want to support text formatting from within your strings.xml file, you have to escape the tags – or use a CDATA section.. Otherwise Android simply ignores them when reading the resource file.

e.g

<string name="hello_world">
<![CDATA[
<p>This is a html-formatted string with <b>bold</b> and <i>italic</i> text</p>
<p>This is another paragraph of the same string.</p>
]]>
</string>

OR

String styledText = "This is <font color='red'>simple</font>.";
textView.setText(Html.fromHtml(styledText), TextView.BufferType.SPANNABLE);
Amit Gupta
  • 8,914
  • 1
  • 25
  • 33
  • thanx for the feedback, and if I want to change my application's label color how would I do that, in the .xml files? – Bohrend Oct 28 '13 at 09:09
  • Hello world!. But note that this only works on a relatively short list of built-in colors: aqua, black, blue, fuchsia, green, grey, lime, maroon, navy, olive, purple, red, silver, teal, white, and yellow – Edward Falk Jul 27 '15 at 14:22
  • 3
    Also, I'm confused: why the CDATA? This would *escape* the formatting tags so they don't do anything. – Edward Falk Jul 27 '15 at 14:58
  • @B.shruti it is printing the tag because you didnt parse it programmatically as a Html using Html.fromHtml...check Silambarasan answer – Distjoy May 01 '17 at 19:52
15

I would use a SpannableString to change the color.

int colorBlue = getResources().getColor(R.color.blue);
    String text = getString(R.string.text);
    SpannableString spannable = new SpannableString(text);
    // here we set the color
    spannable.setSpan(new ForegroundColorSpan(colorBlue), 0, text.length(), 0);

OR you may try this

devnull
  • 118,548
  • 33
  • 236
  • 227
Amresh
  • 2,098
  • 16
  • 20
14

If you wish to change the font color inside string.xml file, you may try the following code.

<resources>
   <string name="hello_world"><font fgcolor="#ffff0000">Hello world!</font></string>
</resources>
Ibungo
  • 1,137
  • 12
  • 23
  • It used to work; it broke in 4.x. See TWiStErRob's explanation and work-around at http://stackoverflow.com/a/11577658/338479. – Edward Falk Jul 27 '15 at 15:04
13
<string name="hello_world"><font fgcolor="red">Hello</font>
    </font fgcolor="blue">world!</font></string>

But note that this only works on a relatively short list of built-in colors: aqua, black, blue, fuchsia, green, grey, lime, maroon, navy, olive, purple, red, silver, teal, white, and yellow. See https://stackoverflow.com/a/31655150/338479 for a way to do it with arbitrary colors.

Community
  • 1
  • 1
Edward Falk
  • 9,991
  • 11
  • 77
  • 112
5

This is the easy and the best way to add multiple colors in one string.

<string name="color_as">Any Text<font fgcolor='#FF0000'> *Text 1* </font><font fgcolor='#ffc821'> *Text 2 * </font></string>
Jayesh Dankhara
  • 525
  • 7
  • 8
3

You don't. strings.xml is just here to define the raw text messages. You should (must) use styles.xml to define reusable visual styles to apply to your widgets.

Think of it as a good practice to separate the concerns. You can work on the visual styles independently from the text messages.

Aurelien Ribon
  • 7,548
  • 3
  • 43
  • 54
  • @user2042227 also consider a `colors.xml` file so that you define all your colors defined in a single place, and only reference them in other places like `@color/app_background` – ataulm Oct 28 '13 at 08:39
  • Personally, I do not use colors.xml, only styles.xml. It may be a habit from CSS files (in HTML) and XAML customtemplates (in WPF/WindowsPhone). This extra file does not separate concerns, but enables the reuse of a same color in different elements. – Aurelien Ribon Oct 28 '13 at 08:45
2

For those who have come here for the answers from searching in google at 2021 Just use

<string name="hello_world"><font color="#your_color_in_hexa"> Hello</font> world!</string>

This above code will color the "Hello" part of the text

Khaled Saifullah
  • 2,279
  • 3
  • 25
  • 26
1

You do not set such attributes in strings.xml type of files. You need to set it in your code. or (which is better solution) create style with colors you want and apply to your TextView

Marcin Orlowski
  • 72,056
  • 11
  • 123
  • 141
1

Use CDATA in the below way for formatting your text

<resources>
<string name="app_name">DemoShareActionButton</string>
<string name="intro_message">
    <b>
    <![CDATA[ This sample shows you how a provide a context-sensitive ShareActionProvider.
    ]]>
    </b>
    </string>

Just add any tag you want before the <![CDATA[ and you will get your proper output.

B.shruti
  • 1,589
  • 1
  • 21
  • 41