2012-05-14 25 views
11

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

回答

0

你有没有尝试添加android:singleLine="true"你的XML?

+0

没有看,因为我想最多两行。我只想把电子邮件地址作为一个单词包装在一起。 – pforhan

+0

道歉,我以前不明白。现在让你更有意义为什么你试图用spannable做到这一点。 :) – Barak

5

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

有不断裂空格字符,所以你需要更换所有你想成为牢不可破这个字符(\ u00A0)

由一个例子

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

的空间办法我已经找了一个跨度的解决方案,但没有找到一个,WrapTogetherSpan只是一个接口,因此它不会工作...

,但用这种方法我敢肯定,你可以做一个自定义的牢不可破如果你愿意的话吨。

+0

那么,这适用于空间。但在问题中提到的电子邮件地址的情况下,这并没有帮助。我*可能*能够在那里粘贴不可见的字符,如U + FEFF或U + 2060,但这只是令人讨厌的,因为它必须位于每个字符之间。 – pforhan

1

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

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; 
} 

该输出显示了可以接受换行符的边界起始索引。

0 My 
3 email 
9 is 
12 [email protected]