Android and in TextView
AndroidTextviewAndroid Problem Overview
is it possible to add
in TextView? Has anyone achieved similar functionality?
I want to have non-breakable space in TextView.
Android Solutions
Solution 1 - Android
TextView
respects the Unicode no-break space character (\u00A0
), which would be a simpler/lighter solution than HTML.
Solution 2 - Android
It is possible to use
to have a readable solution. Including \u00A0
or  
or  
/ 
in the text doesn't really convey much information to the reader of the source code (or translator for that matter), unless you remember the hex codes. Here's a way to use the named entity in strings.xml
:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE resources [
<!ENTITY nbsp " "><!-- non-breaking space, U+00A0 -->
]>
<resources>
...
</resources>
This will create the missing declaration. The original HTML declaration can be found in https://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent referenced from the usual XHTML DTDs. All this works, because the XML parser reads these and substitutes while loading the file, so the entity won't be present in the resulting compiled resources.
in Android Text (CharSequence
) Resources
<!-- Defined in <resources> -->
<string name="html_text">Don\'t break <b>this name</b></string>
<!-- Used in a layout -->
<TextView
android:layout_width="130dp"
android:layout_height="wrap_content"
android:background="#10000000"
android:text="@string/html_text"
/>
Device and preview (preview doesn't recognize HTML)
in Android String (formatted) Resources
<!-- Defined in <resources> -->
<string name="formatted_text">%1$s is nice</string>
<!-- Used in a layout -->
<TextView
android:layout_width="130dp"
android:layout_height="wrap_content"
android:background="#10000000"
tools:text="@string/formatted_text"
/>
Then in code:
String contents = getString(R.string.formatted_text, "Using an ");
((TextView)view.findViewById(android.R.id.text1)).setText(contents);
Device and preview (preview doesn't recognize entities and Java strings are literal text!)
Further tricks
These are just example uses of DTD entities, use it base on your own preference.
<!ENTITY con "\'"><!-- contraction, otherwise error: "Apostrophe not preceded by \"
Sadly ' cannot be overridden due to XML spec:
https://www.w3.org/TR/xml/#sec-predefined-ent -->
<!ENTITY param1 "%1$s"><!-- format string argument #1 -->
<string name="original">Don\'t wrap %1$s</string>
<string name="with_entities">Don&con;t wrap ¶m1;</string>
Solution 3 - Android
\u00A0
is a non-breaking space, \u0020
is not a non-breaking space
Solution 4 - Android
The TextView should respect the non breaking space
<string name="test">Hello world</string>
or
new TextView("Hello\u00A0world");
Solution 5 - Android
One unique situation I ran into was adding a non-breaking space to a string resource that took String.format
parameters.
<resources>
<string name="answer_progress" formatted="false">Answered %d of %d</string>
</resources>
I tried to simply copy and past the non-breaking space character into the string and it was replaced with a regular old space after compiling.
Removing the formatted="false", numbering the format args and using the backslash notation worked for me:
<resources>
<string name="answer_progress">Answered %1$d\u00A0of\u00A0%2$d</string>
</resources>
Solution 6 - Android
This worked for me:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
textview.setText(Html.fromHtml(your string, Html.FROM_HTML_MODE_LEGACY));
} else {
textview.setText(Html.fromHtml(your string);
}
Solution 7 - Android
This is an example that using nbsp in a TextView
<string name="text">Example:\u00A0</string>
Solution 8 - Android
Strange, but in my case non of these two worked:
\u00A0
TheTextView
was showing them as text.
So I just inserted non-breaking space as it is: " "