2013-07-26 37 views
12

Xin chào, tôi đã đặt một số văn bản trong chế độ xem văn bản.Cách chuyển đổi SpannedString thành Spannable

TextView tweet = (TextView) vi.findViewById(R.id.text); 
tweet.setText(Html.fromHtml(sb.toString())); 

Sau đó, tôi cần phải chuyển đổi các văn bản của TextView vào Spannble. Vì vậy, tôi đã làm điều này như:

Spannable s = (Spannable) tweet.getText(); 

tôi cần phải chuyển đổi nó Spannable vì tôi đã thông qua TextView vào một chức năng:

private void stripUnderlines(TextView textView) { 
      Spannable s = (Spannable) textView.getText(); 
      URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); 
      for (URLSpan span : spans) { 
       int start = s.getSpanStart(span); 
       int end = s.getSpanEnd(span); 
       s.removeSpan(span); 
       span = new URLSpanNoUnderline(span.getURL()); 
       s.setSpan(span, start, end, 0); 
      } 
      textView.setText(s); 
     } 

private class URLSpanNoUnderline extends URLSpan { 
     public URLSpanNoUnderline(String url) { 
      super(url); 
     } 

     @Override 
     public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
    } 

Điều này cho thấy không có lỗi/cảnh báo. Nhưng hãy ném Lỗi Runtime:

java.lang.ClassCastException: android.text.SpannedString cannot be cast to android.text.Spannable 

Làm cách nào để chuyển đổi SpannedStringt/văn bản của văn bản thành Spannble? Hoặc tôi có thể thực hiện nhiệm vụ tương tự với SpannedString bên trong chức năng này không?

+0

Khủng khiếp khi người dùng giao diện quyết định tạo liên kết không có gạch dưới? Đi qua cùng một điều. – portfoliobuilder

Trả lời

20

How can I convert the SpannedStringt/text of the textview into Spannble?

new SpannableString(textView.getText()) sẽ hoạt động.

Or can I do the same task with SpannedString inside the function?

Xin lỗi, nhưng removeSpan()setSpan() là các phương pháp trên giao diện Spannable, và SpannedString không thực hiện Spannable.

+0

'new SpannableString (textView.getText())' Tôi không cần điều này vì 'textView.getText()' đã là 'SpannedString'. Tôi cần phải chuyển đổi 'textView.getText()' thành 'Spannable'. Không có cách nào khác ư? –

+1

@typedef: Vui lòng đọc lại câu trả lời của tôi. Xin lưu ý rằng tôi đang yêu cầu bạn tạo ** 'SpannableString' **. 'SpannableString' thực hiện' Spannable'. 'SpannedString' không. – CommonsWare

+0

Thưa ông, làm cách nào tôi có thể chuyển đổi gạch dưới của văn bản của một lần xem văn bản. Bạn có thể cho tôi một số gợi ý không? –

-1

Nếu bạn chỉ định BufferType.SPANNABLE khi thiết lập văn bản của s TextView, sau đó khi nhận được văn bản bạn có thể bỏ nó vào Spannable

myTextView.setText("hello", TextView.BufferType.SPANNABLE); 
... 
... 
... 
Spannable str = (Spannable) myTextView.getText(); 
2

này cần được công việc đúng xung quanh. Thoáng muộn của nó nhưng ai đó có thể cần nó trong tương lai

private void stripUnderlines(TextView textView) { 
     SpannableString s = new SpannableString(textView.getText()); 
     URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); 
     for (URLSpan span : spans) { 
      int start = s.getSpanStart(span); 
      int end = s.getSpanEnd(span); 
      s.removeSpan(span); 
      span = new URLSpanNoUnderline(span.getURL()); 
      s.setSpan(span, start, end, 0); 
     } 
     textView.setText(s); 
    } 



private class URLSpanNoUnderline extends URLSpan { 
    public URLSpanNoUnderline(String url) { 
     super(url); 
    } 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     super.updateDrawState(ds); 
     ds.setUnderlineText(false); 
    } 
} 
0

Thật không may, không có gì trong số này phù hợp với tất cả các giải pháp của bạn mà tôi đã tìm được thứ gì đó hiệu quả.

Nó sẽ báo lỗi đúc các textView.getText() để Spannable trừ khi bạn xác định nó như SPANNABLE

Cũng Chú ý từ @ trang CommonsWare của:

Lưu ý rằng bạn không muốn gọi setText() trên TextView, nghĩ rằng bạn sẽ thay thế văn bản bằng phiên bản đã sửa đổi. Bạn đang sửa đổi văn bản của TextView tại chỗ trong phương thức fixTextView() này và do đó setText() là không cần thiết. Tồi tệ hơn, nếu bạn đang sử dụng android: autoLink, setText() sẽ khiến Android quay lại và thêm lại URLSpans.

accountAddressTextView.setText(accountAddress, TextView.BufferType.SPANNABLE); 

stripUnderlines(accountAddressTextView); 

private void stripUnderlines(TextView textView) { 
    Spannable entrySpan = (Spannable)textView.getText(); 
    URLSpan[] spans = entrySpan.getSpans(0, entrySpan.length(), URLSpan.class); 

    for (URLSpan span: spans) { 
      int start = entrySpan.getSpanStart(span); 
      int end = entrySpan.getSpanEnd(span); 
      entrySpan.removeSpan(span); 
      span = new URLSpanNoUnderline(entrySpan.subSequence(start, end).toString()); 
      entrySpan.setSpan(span, start, end, 0); 
    } 
} 
Các vấn đề liên quan