I can use Spannable in TextViews to create spans with different looks, underlines, strikethroughs and such. How can I do the same to alter line wrapping behavior? In particular, I don't want an email address to wrap in the middle, I want it to act like one word.
I tried WrapTogetherSpan, but I couldn't get it to work. It looks like it is only used by DynamicLayout, and I could not force the TextView to use DynamicLayout.
<TextView
android:id="@+id/merchant_email_field"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="@dimen/account_setting_email"
android:gravity="center"
android:bufferType="spannable"
android:maxLines="2"
android:ellipsize="end"
/>
How I'm setting the spannable:
WrapTogetherSpan TOGETHER_SPAN = new WrapTogetherSpan() {};
String collectedString = getString(R.string.email_sentence, userEmail);
int emailOffset = collectedString.indexOf(userEmail);
Spannable emailSpannable = Spannable.Factory.getInstance()
.newSpannable(collectedString);
emailSpannable.setSpan(TOGETHER_SPAN, emailOffset,
emailOffset + userEmail.length(),
Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(emailSpannable)
If you are implementing a more low-level solution (ie, drawing your own text and handling line-wrapping yourself), then see
BreakIterator
. TheBreakIterator.getLineInstance()
factory method treats email addresses as a single unit.The output shows the boundary start indexes where line breaks would be acceptable.
See also
BreakIterator
work in Android?StaticLayout
used in Android?Have you tried adding
android:singleLine="true"
to your XML?Don't know if you have found an answer to it but you can use unicode to help you out.
there is a non-break space character, so you will need to replace all the spaces you want to be unbreakable with this character (\u00A0)
for an example
by the way I've looked for a span solution and couldn't find one, WrapTogetherSpan is just an interface so it wouldn't work...
but with this method I'm sure you could make a custom unbreakable span if you want.