2013-11-27 20 views
6

tôi có một TextView chứa đầy văn bản mà tôi nhận được từ một máy chủ. Tôi đang sử dụng Linkify để xử lý tất cả liên kết đang tìm kiếm và đặt URLSpan khi cần trong suốt phương thức addLinks của nó.Xử lý các nhấp chuột vào các liên kết của TextView trong khi sử dụng Linkify để tìm và thiết lập các liên kết bên trong văn bản

Vấn đề là hành vi mặc định khi nhấp vào một liên kết đang mở nó trong trình duyệt, điều tôi muốn là nhận liên kết được nhấp và xử lý bản thân của tôi.

Tôi không thấy bất kỳ phương pháp Linkify mà hãy để tôi thiết lập một "onclick" hoặc một cái gì đó ...

Thank bạn đã giúp đỡ :)

Trả lời

10

Ok vì vậy, cuối cùng tôi đã quản lý để đặt "OnClickListener" của riêng mình thành các liên kết của TextView. Giải pháp của tôi là để sao chép Linkify để dự án của tôi, tên nó CustomLinkify và chỉ cần thay đổi phương pháp applyLink của nó:

Từ:

private static final void applyLink(String url, int start, int end, Spannable text) 
{ 
    URLSpan span = new URLSpan(url); 

    text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
} 

Để:

private static final void applyLink(final String url, int start, int end, Spannable text) 
{ 
    URLSpan span = new URLSpan(url) 
    { 
     @Override 
     public void onClick(View widget) 
     { 
      _onLinkClickListener.onLinkClicked(url); 
     } 
    }; 

    text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
} 

đâu _onLinkClickListener là một lĩnh vực mới, do tôi đặt trước khi sử dụng CustomLinkify mới.

Tôi biết nó không phải là một giải pháp rất tao nhã và tôi thích google cho phép thiết lập một người nghe thông qua Linkify bản địa, nhưng đối với tôi, điều này là tốt hơn so với thực hiện của riêng tôi Spannable logics (như đề xuất trong câu hỏi liên quan khác).

Tôi tin tưởng mã Linkify và tôi đoán thỉnh thoảng tôi sẽ kiểm tra xem có bất kỳ thay đổi nào được thực hiện trên đó hay không, nếu có, tất nhiên tôi sẽ cập nhật CustomLinkify với các thay đổi.

Hy vọng điều này sẽ giúp ai đó.

+0

Xin chào, Cảm ơn vì giải pháp tôi đã cố gắng đối phó Linkify.java với dự án của tôi nhưng dường như nó đang sử dụng một số thư viện bên ngoài như libcore.util.EmptyArray và com.android.i18n không thể nhập vào dự án của tôi .Bạn có thể vui lòng đăng thêm thông tin về cách bạn quản lý để làm việc này không. Cảm ơn. – user465125

-4

Có lẽ bạn nên sử dụng một WebView thay vì một TextView ?

+0

Tôi không nghĩ rằng việc sử dụng webView để chỉ hiển thị văn bản có liên kết là giải pháp. Nhưng dù gì cũng cảm ơn. – Shirane85

+1

Nhưng với WebView, bạn có thể tự mình xử lý các nhấp chuột của mình. BTW: Downvoting một workaround là vô lý. Bạn sẽ không nhận được bất kỳ câu trả lời nào khác từ bất kỳ ai trên Satckoverflow nếu bạn downvote cách giải quyết thay vì câu trả lời không tốt. Có lẽ bạn phải đọc lại cách hoạt động của downvoting: http://stackoverflow.com/help/privileges/vote-down – kirsche40

+0

@ kirsche40 Downvoting chỉ khả dụng khi bạn đã vượt quá 125 danh tiếng, họ chỉ có 51. – hichris123

2

Tôi cũng thấy nó tẻ nhạt để triển khai các bản ghi tùy chỉnh có thể chỉnh sửa trong ứng dụng và kết thúc việc tạo thư viện cho việc này. Xem Textoo.

Với Textoo, điều này có thể được đạt được như:

TextView myTextView = Textoo 
    .config((TextView) findViewById(R.id.my_text_view)) 
    .linkifyEmailAddresses() 
    .linkifyMapAddresses() 
    .linkifyPhoneNumbers() 
    .linkifyWebUrls() // or just .linkifyAll() 
    .linkify(patternSettings, "internal://settings/") 
    .linkify(patternGoogle, "http://www.google.ie/search2?q=", null, transformFilter) 
    .linkify(patternGoogle, "http://www.google.ie/search3?q=", matchFilter, transformFilter) 
    .addLinksHandler(new LinksHandler() { 
     @Override 
     public boolean onClick(View view, String url) { 
      if ("internal://settings/location".equals(url)) { 
       Intent locSettings = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       startActivity(locSettings); 
       return true; 
      } else { 
       return false; 
      } 
     } 
    }) 
    .apply(); 

Chỉ cần để chia sẻ và hy vọng ai đó sẽ tìm thấy nó hữu ích.

Các vấn đề liên quan