2013-02-13 30 views
22

Tôi muốn có một số TextView có thể chọn và được liên kết. Khi tôi làm cả hai tôi kết thúc với văn bản có thể lựa chọn nhưng các liên kết không thể được nhấp vào.TextView được liên kết và có thể chọn?

EDIT:

tôi sẽ hiển thị mã để giải thích với những gì tôi phải vật lộn:

TextView textView = view.findViewById(R.id.mytext); 
    textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah"); 
    Linkify.addLinks(textView, Linkify.ALL); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
     textView.setTextIsSelectable(true); 
    } 
+0

Bạn đang làm gì không hoạt động? Không cố gắng để làm cho nó liên kết chỉ làm việc? –

+0

Khi tôi liên kết, tôi có thể nhấp vào url và điện thoại. Nhưng khi tôi làm cho nó có thể lựa chọn nhấp chuột là không thể nữa – pixel

Trả lời

15

Bạn hãy thử để thêm video này trên mã xml TextView của bạn?

<TextView 
    ... 
    android:autoLink="all" 
    android:textIsSelectable="true" /> 

Tôi đã thử trên mã của mình và tôi có thể thực hiện cuộc gọi/lướt trên web/thư và cũng có thể chọn tất cả văn bản.

+0

Vì vậy, nó chỉ về lạm phát chuẩn bị trước 'textView' (như' textView = inflater.inflate (R.layout.linkify_text_view, null) ') vì nó không hoạt động đúng khi thêm thông qua mã. Ngoài ra, hãy kiểm tra http: // commonsware này.com/blog/2013/10/23/linkify-autolink-need-custom-urlspan.html – Stan

2

Sự cố nằm trong số TextView của Android. Gọi số Linkify.addLinks() sẽ không tự động thay đổi autolinkmask trong số TextView. Tôi nghĩ rằng đó là một lỗi Android mà họ kiểm tra mAutoLinkMask. Vì vậy, nếu bạn đặt android:autoLink trong xml tệp hoặc gọi setAutoLinkMask() thành giá trị không 0, nó sẽ hoạt động.

FYI, mã nguồn TextView 's:

  if (touchIsFinished && mLinksClickable && mAutoLinkMask != 0 && textIsSelectable) { 
      // The LinkMovementMethod which should handle taps on links has not been installed 
      // on non editable text that support text selection. 
      // We reproduce its behavior here to open links for these. 
      ClickableSpan[] links = ((Spannable) mText).getSpans(getSelectionStart(), 
        getSelectionEnd(), ClickableSpan.class); 

      if (links.length > 0) { 
       links[0].onClick(this); 
       handled = true; 
      } 
     } 
13

Thuộc tính autoLink có lỗi gây phiền nhiễu: nếu bạn nhấp vào trong ví dụ của bạn vào số điện thoại, sau đó trở lại và nhấp vào liên kết url thứ hai - nó sẽ mở lại số điện thoại. Thuộc tính này hoạt động rất xấu với nhiều liên kết, mà tôi đã thực hiện lớp của riêng tôi, đây là liên kết trên Github ClickableLinksTextView.java

Trong ví dụ của bạn, bạn có thể thay thế lớp TextView của bạn theo hạng ClickableLinksTextView tôi trong xml-bố trí và thay đổi mã như thế này:

ClickableLinksTextView textView = (ClickableLinksTextView)view.findViewById(R.id.mytext); 
textView.setText("My text: +4412345678 Go to website: www.google.com Blah blah"); 
Linkify.addLinks(textView, Linkify.ALL); 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    textView.setMovementMethod(ArrowKeyMovementMethod.getInstance()); 
    textView.setTextIsSelectable(true); 
    // the autoLink attribute must be removed, if you hasn't set it then ok, otherwise call textView.setAutoLink(0); 
} 

nguyên nhân ban đầu của vấn đề trong câu hỏi của bạn là lớp LinkMovementMethodtextIsSelectable thuộc tính không tương thích chút nào, thậm chí các nhà phát triển hệ điều hành Android thừa nhận điều này trong the Android OS source code.

Không thay đổi phương thức di chuyển cho văn bản hỗ trợ lựa chọn văn bản vì nó sẽ ngăn chặn chuyển dịch con trỏ tùy ý.

Nếu độ xem văn bản là lựa chọn, chỉ 2 đúng phong trào các giá trị phương pháp là nullArrowKeyMovementMethod. Đó là lý do tại sao tôi đặt ArrowKeyMovementMethod một cách rõ ràng trong ví dụ của tôi, vì Linkify.addLinks đặt phương thức di chuyển không chính xác và tôi nên hoàn nguyên.

Vì lỗi của thuộc tính autoLink, đó là do nhà phát triển Android chưa sao chép chính xác phát hiện liên kết. Bạn có thể xem ví dụ mã trong câu trả lời của @cheng yang, mã chỉ nhận liên kết đầu tiên cho dù bạn có bao nhiêu.

+0

textView.setMovementMethod (ArrowKeyMovementMethod.getInstance()); là những gì tôi cần để làm cho nó hoạt động cho tôi. –

+0

Sử dụng nó cùng với các URLSpans của riêng tôi kết hợp với các nhịp tùy chỉnh khác và lớp học của bạn hoạt động rất tốt. Cảm ơn bạn đã cung cấp! Btw không cần phải cast nó một cách rõ ràng tới ClickableLinksTextView vì api TextView không bị ảnh hưởng. – Makibo

+0

Cảm ơn rất nhiều nó giúp rất nhiều –

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