2012-05-14 65 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]