改变换行行为

时间:2012-05-14 23:22:28

标签: android textview linewrap

我可以在TextViews中使用Spannable来创建具有不同外观,下划线,删除线等的跨距。如何改变换行行为呢?特别是,我不希望在中间包装一个电子邮件地址,我希望它像一个单词一样。

我尝试了WrapTogetherSpan,但我无法让它发挥作用。看起来它只被DynamicLayout使用,我无法强制TextView使用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"
  />

我如何设置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)

3 个答案:

答案 0 :(得分:5)

不知道你是否找到了答案,但你可以使用unicode来帮助你。

有一个非中断空格字符,因此您需要使用此字符替换所有想要牢不可破的空格(\ u00A0)

示例

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

顺便说一下,我找了一个跨度解决方案但找不到一个, WrapTogetherSpan 只是一个界面,所以它不会工作......

但是使用这种方法,我确定如果你愿意,你可以制作一个自定义的牢不可破的范围。

答案 1 :(得分:1)

如果您正在实施更低级别的解决方案(即绘制自己的文本并自行处理换行),请参阅BreakIteratorBreakIterator.getLineInstance()工厂方法将电子邮件地址视为一个单元。

String text = "My email is me@example.com.";
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;
}

输出显示边界开始索引,其中换行符是可接受的。

0 My 
3 email 
9 is 
12 me@example.com.

另见

答案 2 :(得分:0)

您是否尝试将android:singleLine="true"添加到XML?