14

我可以在 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)
4

3 回答 3

7

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

有一个不间断的空格字符,所以你需要用这个字符替换所有你想牢不可破的空格(\u00A0)

举个例子

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

顺便说一句,我一直在寻找一个跨度解决方案但找不到, WrapTogetherSpan只是一个接口,所以它不会工作......

但是通过这种方法,我相信如果你愿意,你可以制作一个自定义的牢不可破的跨度。

于 2014-07-09T06:08:06.227 回答
3

如果您正在实施更底层的解决方案(即绘制自己的文本并自己处理换行),请参阅BreakIterator. 工厂方法将BreakIterator.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.

也可以看看

于 2017-02-14T08:58:38.857 回答
0

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

于 2012-05-15T04:02:58.293 回答