2012-05-14 14 views
11

Tôi có thể sử dụng Spannable trong TextViews để tạo các nhịp có hình dạng khác nhau, gạch dưới, gạch ngang và các kiểu như vậy. Làm thế nào tôi có thể làm tương tự để thay đổi hành vi gói hàng? Đặc biệt, tôi không muốn một địa chỉ email để bọc ở giữa, tôi muốn nó hoạt động như một từ.Thay đổi hành vi quấn dòng

Tôi đã thử WrapTogetherSpan, nhưng tôi không thể làm cho nó hoạt động. Có vẻ như nó chỉ được sử dụng bởi DynamicLayout và tôi không thể ép TextView sử dụng 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" 
    /> 

Làm thế nào tôi đang thiết lập các 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) 

Trả lời

0

Bạn đã thử thêm android:singleLine="true" to XML của bạn?

+0

Không, bởi vì tôi muốn lên đến hai dòng. Tôi chỉ muốn địa chỉ email kết hợp với nhau thành một từ. – pforhan

+0

Xin lỗi, tôi không hiểu điều đó trước đây. Làm cho nhiều ý nghĩa hơn bây giờ lý do tại sao bạn đã cố gắng để làm điều đó với một spannable. :) – Barak

5

Không biết nếu bạn đã tìm thấy câu trả lời cho nó nhưng bạn có thể sử dụng unicode để giúp bạn.

có một nhân vật không gian phi-break, vì vậy bạn sẽ cần phải thay thế tất cả các không gian bạn muốn trở thành không thể phá vỡ với nhân vật này (\ u00A0)

cho một ví dụ

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

bởi cách tôi đã tìm kiếm một giải pháp span và không thể tìm thấy một giải pháp span, WrapTogetherSpan chỉ là một giao diện để nó không hoạt động ...

nhưng với phương pháp này tôi chắc chắn bạn có thể tạo tùy chỉnh không thể phá vỡ span nếu bạn wan t.

+0

Vâng, điều này làm việc cho không gian. Nhưng trong trường hợp của một địa chỉ email như đã đề cập trong câu hỏi, nó không giúp ích gì. Tôi * có thể * có thể dán các ký tự vô hình như U + FEFF hoặc U + 2060 trong đó, nhưng điều đó chỉ gây phiền nhiễu, vì nó sẽ phải nằm giữa mọi charactetr. – pforhan

1

Nếu bạn đang triển khai giải pháp cấp thấp hơn (ví dụ: vẽ văn bản của chính bạn và tự xử lý gói hàng), sau đó xem BreakIterator. Phương pháp nhà máy BreakIterator.getLineInstance() coi địa chỉ email là một đơn vị duy nhất.

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

Đầu ra hiển thị chỉ mục bắt đầu biên khi ngắt dòng sẽ được chấp nhận.

0 My 
3 email 
9 is 
12 [email protected] 

Xem thêm