Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Altering line wrap behavior

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)
like image 849
pforhan Avatar asked May 14 '12 23:05

pforhan


People also ask

What is meant by text wrapping?

Text wrapping refers to how images are positioned in relation to text in a document, allowing you to control how pictures and charts are presented.

How do you wrap a sentence in CSS?

CSS word-wrap property is used to break the long words and wrap onto the next line. This property is used to prevent overflow when an unbreakable string is too long to fit in the containing box.

How do you force text wrap in CSS?

Today I'm going to talk about a rarely used but extremely useful CSS property, the word-wrap. You can force long (unbroken) text to wrap in a new line by specifying break-word with the word-wrap property.

How do I make text not wrap in CSS?

If you want to prevent the text from wrapping, you can apply white-space: nowrap; Notice in HTML code example at the top of this article, there are actually two line breaks, one before the line of text and one after, which allow the text to be on its own line (in the code).


2 Answers

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

String text = "Hello World";
text.replace(' ', '\u00A0');
textView.setText(text);

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.

like image 85
ndori Avatar answered Oct 04 '22 16:10

ndori


If you are implementing a more low-level solution (ie, drawing your own text and handling line-wrapping yourself), then see BreakIterator. The BreakIterator.getLineInstance() factory method treats email addresses as a single unit.

String text = "My email is [email protected].";
BreakIterator boundary = BreakIterator.getLineInstance();
boundary.setText(text);
int start = boundary.first();
for (int end = boundary.next(); end != BreakIterator.DONE; end = boundary.next()) {
    System.out.println(start + " " + text.substring(start, end));
    start = end;
}

The output shows the boundary start indexes where line breaks would be acceptable.

0 My 
3 email 
9 is 
12 [email protected].

See also

  • How does BreakIterator work in Android?
  • How is StaticLayout used in Android?
like image 29
Suragch Avatar answered Oct 04 '22 15:10

Suragch