Làm cách nào để tạo liên kết trong TextView có thể nhấp?


1003

Tôi có TextView sau được định nghĩa:

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="@string/txtCredits"
    android:autoLink="web" android:id="@+id/infoTxtCredits"
    android:layout_centerInParent="true"
    android:linksClickable="true"></TextView>

nơi @string/txtCreditslà một nguồn tài nguyên chuỗi chứa <a href="some site">Link text</a>.

Android đang làm nổi bật các liên kết trong TextView, nhưng chúng không đáp ứng với các nhấp chuột. Ai đó có thể cho tôi biết những gì tôi đang làm sai? Tôi có phải đặt onClickListener cho TextView trong hoạt động của mình cho một cái gì đó đơn giản như thế này không?

Có vẻ như nó liên quan đến cách tôi xác định tài nguyên chuỗi của mình. Điều này không hoạt động:

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>

Nhưng điều này không:

<string name="txtCredits">www.google.com</string>

Đó là một người lập dị bởi vì tôi muốn hiển thị một liên kết văn bản hơn là hiển thị URL đầy đủ.


67
android: autoLink = "web" đây là dòng chính cần được thêm vào xml và nó hoạt động như bùa mê. cảm ơn
@Richard

1
<string name = "txtCredits"> <a href=" google.com"> www.google.com </a> </ string > sử dụng sttring ở trên và nó hoạt động. Người ta biết rằng chuỗi in href và với thẻ neo phải giống nhau và có .com hoặc. * Để hoạt động cần kiểm tra tại sao
Shaik Khader 22/03/13

<string name = "txtCredits"> Một số văn bản tại đây <a href=" google.com"> Google </a> </ string > Đối với đoạn trích trên Nhấp vào Một số văn bản ở đây không nên hoạt động trong trường hợp của tôi, tôi nên làm gì?
Ajay Takur


android:focusable="true"đã giải quyết vấn đề của tôi
Khang .NT

Câu trả lời:


1228

Bị chôn vùi trong các bản demo API Tôi đã tìm thấy giải pháp cho vấn đề của mình:

Link.java:

    // text2 has links specified by putting <a> tags in the string
    // resource.  By default these links will appear but not
    // respond to user input.  To make them active, you need to
    // call setMovementMethod() on the TextView object.

    TextView t2 = (TextView) findViewById(R.id.text2);
    t2.setMovementMethod(LinkMovementMethod.getInstance());

Tôi đã xóa hầu hết các thuộc tính trên TextView của mình để khớp với những gì có trong bản demo.

<TextView
    android:id="@+id/text2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/txtCredits"/>

Điều đó đã giải quyết nó. Khá khó để phát hiện và sửa chữa.

Quan trọng : Đừng quên xóa autoLink="web"nếu bạn đang gọi setMovementMethod().


19
Có lẽ đó chỉ là tôi, nhưng tại sao bạn lại làm điều này với EditText?
Justin

1
Hóa ra chỉ cần setMovementMethod để đạt được mục tiêu.
superarts.org

3
Cũng giống như một cam kết, tôi đã thấy một số Samsung Galaxy S3 với OS 4.3 bị sập khi "setMovementMethod (LinkMovementMethod.getInstance ())" được sử dụng, vì vậy chỉ cần tính đến nó, tôi phải tạo một xác nhận trước khi thêm nó
Jorge Aguilar

40
Tương tự ở đây. Lưu ý rằng nếu setMovementMethod () được gọi, cần phải xóa autolink = "web" trong tệp XML hoặc liên kết khác sẽ không hoạt động. Cảm ơn vì nhận xét
voghDev

6
Chỉ cần sử dụng thuộc tính "autoLink" trong xml của bạn, ví dụ: android: autoLink = "web"
Kalpesh

533

Tôi chỉ sử dụng android:autoLink="web"và nó hoạt động tốt. Một nhấp chuột vào liên kết sẽ mở trình duyệt và hiển thị trang chính xác.

Một điều tôi có thể đoán là một số quan điểm khác ở trên liên kết. Một cái gì đó trong suốt lấp đầy toàn bộ cha mẹ nhưng không hiển thị bất cứ điều gì trên liên kết. Trong trường hợp này, nhấp chuột vào chế độ xem này thay vì liên kết.


3
Đã thêm thông tin ở trên. Có thể đó là cách tôi đang xác định chuỗi là <string name = "txtCredits"> <a href=" google.com"> Google </a> </ string >? Có vẻ như điều này được cho phép nhưng nó không hoạt động đối với tôi.
Richard

6
nếu bạn sử dụng linkify auto, bạn không cần phần a href. HĐH sẽ lấy chuỗi phân tích cú pháp cho các url và chuyển đổi mọi url thành một liên kết có thể nhấp. Nhưng điều này sẽ không dẫn đến việc google được liên kết với google.com. Nó sẽ hiển thị www.google.com dưới dạng liên kết.
Janusz

sử dụng autolink cũng hoạt động hoàn hảo đối với tôi, textview đơn giản mà không cần cha mẹ.
euther

2
android: autoLink cũng hoạt động tuyệt vời để liên kết số điện thoại, địa chỉ và địa chỉ email (hoặc tất cả các mục trên).
CloudyMusic

54
Không, bởi vì câu trả lời này không hoạt động nếu bạn không sử dụng thẻ neo với văn bản hiển thị khác với URL
cprcrack

375

Sau khi dành một chút thời gian với điều này, tôi đã thấy rằng:

  • android:autoLink="web"hoạt động nếu bạn có các liên kết đầy đủ trong HTML của bạn. Sau đây sẽ được đánh dấu màu xanh lam và có thể nhấp:
  • Một số tiếp theo <a href="http://www.google.com">http://www.google.com</a>
  • Một số tiếp theo http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance()); sẽ hoạt động với các mục sau (sẽ được tô sáng và có thể nhấp):
  • Một số tiếp theo <a href="http://www.google.com">http://www.google.com</a>
  • Một số tiếp theo http://www.google.com
  • Một số tiếp theo <a href="http://www.google.com">Go to Google</a>

Lưu ý rằng tùy chọn thứ ba có một siêu liên kết, nhưng bản mô tả của liên kết (phần giữa các thẻ) không phải là một liên kết. android:autoLink="web"không KHÔNG làm việc với các liên kết như vậy.

  • android:autoLink="web"nếu được đặt trong XML sẽ ghi đè view.setMovementMethod(LinkMovementMethod.getInstance());(nghĩa là các liên kết thuộc loại thứ ba sẽ được tô sáng, nhưng không thể nhấp được).

Đạo đức của câu chuyện được sử dụng view.setMovementMethod(LinkMovementMethod.getInstance());trong mã của bạn và đảm bảo rằng bạn không có android:autoLink="web"bố cục XML nếu bạn muốn tất cả các liên kết có thể nhấp được.


setMovementMethod không hoạt động với tùy chọn thứ hai mà bạn đã đề cập, ví dụ google.com .. có bản cập nhật nào không?
Darpan

16
Cảm ơn bạn đã chỉ ra rằng <a href="http://www.google.com">Go to Google</a>sẽ không hoạt động cho autoLink. Đối với rất nhiều câu trả lời về SO, đây là người duy nhất đề cập đến nó. Cảm ơn bạn!
cwhsu

Cái này hoạt động. Đã thử nghiệm trên API 29.
Wrichik Basu

96

Các giải pháp trên không hiệu quả với tôi, nhưng các giải pháp sau đây đã làm được (và có vẻ sạch hơn một chút).
Đầu tiên, trong tài nguyên chuỗi, xác định các thẻ mở của bạn bằng cách sử dụng mã hóa thực thể HTML, nghĩa là:

&lt;a href="http://www.google.com">Google&lt;/a>

và không:

<a href="http://www.google.com">Google</a>

Nói chung, mã hóa tất cả các chevron trong chuỗi như thế. BTW, liên kết phải bắt đầu bằnghttp://

Sau đó (như được đề xuất ở đây ) đặt tùy chọn này trên TextView của bạn:

 android:linksClickable="true"

Cuối cùng, trong mã, làm:

((TextView) findViewById(R.id.your_text_view)).setMovementMethod(LinkMovementMethod.getInstance());
((TextView) findViewById(R.id.your_text_view)).setText(Html.fromHtml(getResources().getString(R.string.string_with_links)));

Đó là nó, không có regexes hoặc hack thủ công khác yêu cầu.


7
Điều này sẽ tạo một Trình phân tích cú pháp HTML mỗi khi mã này được thực thi. Lưu ý rằng nếu bạn sử dụng điều này để tạo liên kết bên trong một mục danh sách hoặc tại các vị trí quan trọng về hiệu suất khác trong ứng dụng của bạn. Trong quá trình tạo danh sách, điều này làm tăng thời gian thực hiện các Phương thức getView của tôi giảm 50%
Janusz

1
Cũng cần lưu ý các khoảng trắng trong URL phải được thay thế bằng%20
Nicolas Tyler

Bạn có thể tránh các vấn đề mã hóa thực thể bằng cách gói chuỗi của bạn vào <![CDATA[ ... ]]>thẻ.
Paul Lammertsma

1
CÔNG TRÌNH cho tôi, cảm ơn bạn. Không làm việc với <![CDATA[...]]>thẻ.
ricky.tribbia

Đây nên là câu trả lời! Hoạt động hoàn toàn tốt với ứng dụng gốc của tôi
Ajay Kulkarni

69

tôi đã sử dụng đơn giản

Linkify.addLinks(TextView, Linkify.ALL);

làm cho các liên kết có thể nhấp được đưa ra ở đây


4
Câu trả lời này là tốt nhất. Hoạt động trên mọi phiên bản Android và chúng tôi chỉ cần thêm phương thức đó khi văn bản được đặt trong TextView. Phần thưởng: nó cho phép chúng tôi thêm các liên kết có thể tùy chỉnh có thể nhấp
Kerwan

3
Câu trả lời thực sự đơn giản và tốt nhất. nó hoạt động cho email / web cùng một lúc .... cảm ơn người đàn ông !!!
Imran Ahmed

1
Sử dụng LinkifyCompat nếu bạn cần một số tính năng nâng cao mới hơn
Vaiden

Tốt, nó tạo ra các url mà không <a href...thể nhấp được
Pavel

Nó cũng làm cho tất cả các thẻ "html" bên trong hoạt động tương ứng, ví dụ <b> ... </ b>, v.v.
Mảng

67

Nếu bạn muốn thêm liên kết giống như HTML, tất cả những gì bạn cần làm là:

  • thêm một chuỗi giống như tài nguyên HTML:

     <string name="link"><a href="https://www.google.pl/">Google</a></string>
  • thêm chế độ xem của bạn vào bố cục với cấu hình KHÔNG liên kết cụ thể nào cả:

     <TextView
        android:id="@+id/link"
        android:text="@string/link" />`
  • thêm MovementMethod thích hợp theo chương trình vào TextView của bạn:

     mLink = (TextView) findViewById(R.id.link);
     if (mLink != null) {
       mLink.setMovementMethod(LinkMovementMethod.getInstance());
     }

Đó là nó! Và vâng, việc có các tùy chọn như "autoLink" và "linksClickable" chỉ hoạt động trên các liên kết rõ ràng (không được bao bọc trong các thẻ html) cũng rất dễ gây hiểu lầm cho tôi ...


2
+1 Bạn đúng. Cần có một tùy chọn để nhập một mẫu của bạn để cái này phù hợp. Cách này khá là ngu ngốc.
schlingel

47

Tôi đã thêm dòng này vào TextView: android:autoLink="web"
Dưới đây là một ví dụ về cách sử dụng trong tệp bố cục.

layout.xml mẫu vật

    <TextView
        android:id="@+id/txtLostpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="email"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/lostpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <TextView
        android:id="@+id/txtDefaultpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="web"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/defaultpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

string.xml

<string name="lostpassword">If you lost your password please contact <a href="mailto:support@cleverfinger.com.au?Subject=Lost%20Password" target="_top">support@cleverfinger.com.au</a></string>

<string name="defaultpassword">User Guide <a href="http://www.cleverfinger.com.au/user-guide/">http://www.cleverfinger.com.au/user-guide/</a></string>

36

Những điều sau đây sẽ phù hợp với bất kỳ ai đang tìm kiếm sự kết hợp giữa văn bản và siêu liên kết trong ứng dụng Android.

Trong string.xml:

<string name="applink">Looking for Digital Visiting card? 
<a href="https://play.google.com/store/apps/details?id=com.themarkwebs.govcard">Get it here</a>
</string>

Bây giờ bạn có thể sử dụng điều này stringtrong bất kỳ được đưa ra Viewnhư thế này:

<TextView
    android:id="@+id/getapp"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center"
    android:textColor="@color/main_color_grey_600"
    android:textSize="15sp"
    android:text="@string/applink"/>

Bây giờ, trong Hoạt động hoặc Đoạn của bạn, hãy làm như sau:

TextView getapp =(TextView) findViewById(R.id.getapp);
getapp.setMovementMethod(LinkMovementMethod.getInstance());

Đến bây giờ, bạn không cần phải thiết lập android:autoLink="web"hoặc android:linksClickable="true"sử dụng phương pháp này.

Tôi hy vọng bạn sẽ tìm thấy điều này hữu ích.


Điều này hoạt động tốt, nhưng khi bạn nhấn trở lại từ web đã mở, chỉ đóng trình duyệt, nhưng không quay lại ứng dụng.
Jachumbelechao Unto Mantekilla

27

Tôi hy vọng điều này sẽ giúp bạn;

String value = "<html>Visit my blog <a href=\"http://www.maxartists.com\">mysite</a> View <a href=\"sherif-activity://myactivity?author=sherif&nick=king\">myactivity</a> callback</html>";
    TextView text = (TextView) findViewById(R.id.text);


    text.setText(Html.fromHtml(value));
    text.setMovementMethod(LinkMovementMethod.getInstance());

3
Điều này làm việc tuyệt vời. Cũng chắc chắn rằng bạn loại bỏ android:autoLink=?khỏi của bạn TextView.
sulai

Đây là những gì cuối cùng đã làm việc cho tôi. HTML hợp lệ và không sử dụng android:autoLink=?là quan trọng!
Neal Sanche

Đối với Xamarin, từ hiển thị nhưng không được gạch chân và không thể nhấp vào bằng cách sử dụng các thông số trên và KHÔNG phải các tham số sau: autoLink, linksClickable
maxweber

Đối với Xamarin, cài đặt các cài đặt đó và cài đặt Văn bản hoặc cài đặt TextFormatted cũng mang lại từ nhưng nó không thể nhấp cũng không có màu xanh / gạch chân. Xóa autoLink cũng thất bại. Loại bỏ chỉ linksClickable cũng thất bại. Loại bỏ cả hai cũng thất bại.
maxweber

helloWorld.TextFormatted = Html.FromHtml (linkURL); có và không có những điều đó cũng thất bại. (không được liên kết, không phải màu xanh, không thể nhấp vào)
maxweber

25

Chỉ những gì bạn cần để thêm điều này trong chế độ xem văn bản trong xml

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autoLink="web"/>

24

Cách dễ nhất làm việc với tôi là sử dụng Linkify

TextView txt_Message = (TextView) view.findViewById(R.id.txt_message);
txt_Message.setText("This is link https://www.google.co.in/");
Linkify.addLinks(txt_Message, Linkify.WEB_URLS);

và nó sẽ tự động phát hiện các url web từ văn bản trong textview.


Đúng, nhưng họ sẽ không thể nhấp được.
FractalBob

Các liên kết có thể nhấp.
Octavian Ionel

19

Richard, lần tới, bạn nên thêm mã này trong TextView tại bố cục XML thay thế.

android:autoLink="all"

Điều này nên như thế này.

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:text="@string/txtCredits"
    android:id="@+id/infoTxtCredits"
    android:autoLink="all"
    android:linksClickable="true">
</TextView>

Bạn không cần sử dụng mã này ( t2.setMovementMethod(LinkMovementMethod.getInstance());) để tạo liên kết có thể nhấp.

Ngoài ra, đây là sự thật: chừng nào bạn thiết lập tự động liên kếtlinksClickable , đừng quên để thêm video này vào String.xml tập tin để các liên kết có thể click sẽ làm việc.

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>

3
Không làm việc cho tôi. Liên kết thực sự có thể nhấp, nhưng toàn bộ chuỗi được hiển thị, không chỉ là "Google". Trong thực tế, không có câu trả lời nào ở đây hoặc kết hợp chúng hoạt động cho đến nay.
Hươu cao cổ Violet

Thiết bị hoặc trình giả lập internet của bạn có được bật và đặt thành BẬT (wifi) hoặc có kết nối mạng LAN không, @Violet Gi hươu cao cổ?
David Dimalanta

Nó là. Tôi chưa bao giờ quản lý để làm cho các liên kết có thể nhấp được bằng cách chỉ sử dụng các thuộc tính XML, phải dùng đến mã Java để làm điều đó. Đó không phải là vấn đề lớn, nhưng không tốt đẹp.
Hươu cao cổ Violet

18

bằng cách sử dụng linkify : Linkify lấy một đoạn văn bản và một biểu thức chính quy và biến tất cả các kết quả khớp chính tả trong văn bản thành các liên kết có thể nhấp

TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("http://www.domain.com");
Linkify.addLinks(textView, Linkify.WEB_URLS);

Đừng quên

import android.widget.TextView;

16

Đây là mã android một dòng để có thể chọn điện thoại và url từ textView bất kể chuỗi là gì và dữ liệu là gì. Bạn không cần sử dụng bất kỳ thẻ HTML nào cho việc này.

TextView textView = (TextView)findViewById(R.id.textView1);
textView.setText("some url is www.google.com phone 7504567890 another url lkgndflg.com ");

// Makes the textView's Phone and URL (hyperlink) select and go.
Linkify.addLinks(textView, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);

13

Tôi nhận thấy rằng sử dụng android:autoLink="web"như vậy

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:autoLink="web"/>

hoạt động tốt với các URL nhưng vì tôi có một địa chỉ email và số điện thoại mà tôi muốn liên kết, nên cuối cùng tôi đã sử dụng dòng android:autoLink="all"này như thế này

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:autoLink="all"/>

và nó làm việc như một lá bùa.


13

Quản lý màu văn bản Linkify cũng nhập mô tả hình ảnh ở đây

tv_customer_care_no.setLinkTextColor(getResources().getColor(R.color.blue));
  tv_customer_care_no.setText("For us to reach out to you, please fill the details below or contact our customer care at  18004190899 or visit our website http://www.dupont.co.in/corporate-links/contact-dupont.html ");
   Linkify.addLinks(tv_customer_care_no, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);
   Linkify.addLinks(tv_customer_care_no, Linkify.ALL );

11

Đảm bảo không sử dụng setAutoLinkMask(Linkify.ALL)khi sử dụng setMovementMethod(LinkMovementMethod.getInstance())Html.fromHTML()trên HTMLcác liên kết được định dạng chính xác (ví dụ <a href="http://www.google.com/">Google</a>:).


10

Dùng cái này...

TextView.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Intent in=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.twitter.com/"));
                        startActivity(in);
                    }

                });

và thêm quyền trong tệp kê khai

<uses-permission android:name="android.permission.INTERNET"/>

1
Điều này sẽ hoạt động, nhưng hãy nhớ rằng ứng dụng có thể không cần sự cho phép của Internet ngoài TextView có thể nhấp này. Có thể quá mức cần thiết trong những trường hợp đó
Jose_GD

2
Nó thực sự liên quan đến câu hỏi?
Darpan

2
Điều này không liên quan đến câu hỏi.
afollestad

1
Điều này sẽ không bao giờ thất bại!
Skynet

Tôi thích phương pháp này vì nó cho phép chúng tôi chỉ hiển thị văn bản neo thay vì URL đầy đủ. Văn bản neo cũng có thể được tạo kiểu, ví dụ như màu xanh lá cây và gạch chân.
mất em bé

10

Bạn chỉ cần điều này:

android:autoLink="web"

Chèn dòng này vào TextView, có thể nhấp được với tham chiếu đến web. Địa chỉ URL được đặt làm văn bản của TextView này.

Thí dụ:

 <TextView
    android:id="@+id/textViewWikiURL"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:textStyle="bold"
    android:text="http://www.wikipedia.org/"
    android:autoLink="web" />

10

Câu trả lời được chấp nhận là chính xác, NHƯNG điều đó có nghĩa là số điện thoại, bản đồ, địa chỉ email và các liên kết thông thường, vd http://google.com không có thẻ href sẽ KHÔNG THỂ DỄ DÀNG vì bạn không thể tự động xóa trong xml.

Giải pháp hoàn chỉnh duy nhất để có MỌI THỨ có thể nhấp mà tôi đã tìm thấy là:

Spanned text = Html.fromHtml(myString);
URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class);
SpannableString buffer = new SpannableString(text);
Linkify.addLinks(buffer, Linkify.ALL);
for (URLSpan span : currentSpans) {
    int end = text.getSpanEnd(span);
    int start = text.getSpanStart(span);
    buffer.setSpan(span, start, end, 0);
}
textView.setText(buffer);
textView.setMovementMethod(LinkMovementMethod.getInstance());

Và TextView KHÔNG nên có android:autolink. Không cần android:linksClickable="true"một trong hai; theo mặc định nó đúng


Đối với tôi nó hoạt động mà không có điều này, câu trả lời được chấp nhận hoạt động tốt @Kelly bạn có thể cho biết phiên bản Android và thiết bị mà bạn gặp sự cố không?
Bố Akhil

Không hoạt động cho các myapp://chương trình (cho Liên kết sâu).
CoolMind

7

Đây là cách tôi giải quyết các liên kết có thể nhấp và có thể nhìn thấy trong TextView (theo mã)

private void setAsLink(TextView view, String url){
        Pattern pattern = Pattern.compile(url);
        Linkify.addLinks(view, pattern, "http://");
        view.setText(Html.fromHtml("<a href='http://"+url+"'>http://"+url+"</a>"));
    }

Nhưng tôi muốn xem văn bản và khi nhấp vào văn bản, nó sẽ chuyển hướng đến liên kết (được trình duyệt mở)? Giải pháp này không giải quyết được điều đó, phải không?
Đức Trần

6

Sử dụng mã dưới đây:

String html = "<a href=\"http://yourdomain.com\">Your Domain Name</a>"
TextView textview = (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(LinkMovementMethod.getInstance());
textview.setText(Html.fromHtml(html));

6

[Tested in Pre-lollipop as well as in Lollipop and above]

Bạn có thể lấy chuỗi HTML của mình từ phụ trợ hoặc từ các tệp tài nguyên của bạn. Nếu bạn đặt văn bản của mình dưới dạng chuỗi tài nguyên, hãy đảm bảo thêm CDATAthẻ:

<string name="your_text">![CDATA[...<a href="your_link">Link Title</a>  ...]]</string>

Sau đó, trong mã bạn cần lấy chuỗi và gán nó dưới dạng HTML và đặt phương thức di chuyển liên kết:

String yourText = getString(R.string.your_text);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   textView.setText(Html.fromHtml(yourText, Html.FROM_HTML_MODE_COMPACT));
} else {
   textView.setText(Html.fromHtml(yourText));
}

try {
   subtext.setMovementMethod(LinkMovementMethod.getInstance());
} catch (Exception e) {
   //This code seems to crash in some Samsung devices.
   //You can handle this edge case base on your needs.
}

5

Lý do bạn gặp vấn đề là nó chỉ cố gắng khớp các địa chỉ "trần trụi". những thứ như "www.google.com" hoặc " http://www.google.com ".

Chạy văn bản của bạn thông qua Html.fromHtml () nên thực hiện thủ thuật. Bạn phải làm điều đó theo chương trình, nhưng nó hoạt động.


2
Các liên kết trong TextView có màu khác với các văn bản khác trong chuỗi, vì vậy tôi nghĩ rằng chúng được công nhận là liên kết. Họ chỉ không thể nhấp được :-(
Richard

4

Không biết có đáng để thêm câu trả lời khác không, nhưng chỉ trong trường hợp ...

Tôi đã phải săn lùng nó ở một vài nơi nhưng cuối cùng cũng có phiên bản mã này để hoạt động.

chuỗi XML:

<string name="name1">&lt;a href="http://www.google.com">link text1&lt;/a></string>
<string name="name2">&lt;a href="http://www.google.com">link text2&lt;/a></string>

myactivity.xml:

<TextView 
    android:id="@+id/textview1"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginTop="5dp" />

<TextView 
    android:id="@+id/textview2"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginTop="5dp" />

myactivty.java (trong onCreate ()):

TextView tv1 = (TextView)findViewById(R.id.textview1);
TextView tv2 = (TextView)findViewById(R.id.textview2);

tv1.setText(Html.fromHtml(getResources().getString(R.string.name1)));
tv2.setText(Html.fromHtml(getResources().getString(R.string.name2)));
tv1.setMovementMethod(LinkMovementMethod.getInstance());
tv2.setMovementMethod(LinkMovementMethod.getInstance());

Điều này sẽ tạo ra hai siêu liên kết có thể nhấp với văn bản link text1link text2chuyển hướng người dùng đến google.


4

Điện thoại Autolink không hoạt động với tôi. Sau đây làm việc như một nét duyên dáng,

TextView tv = (TextView) findViewById(R.id.emergencynos);
String html2="<br><br>Fire - <b><a href=tel:997>997</a> </b></br></br>";        
tv.append(Html.fromHtml(html2));
tv.setMovementMethod(LinkMovementMethod.getInstance());

4

Nếu sử dụng TextView dựa trên XML, đối với yêu cầu của bạn, bạn chỉ cần thực hiện hai điều:

  1. Xác định liên kết của bạn trong chuỗi, chẳng hạn như "đây là WebPage của tôi." Bạn có thể thêm nó trong xml hoặc trong mã.

  2. Trong xml có TextView, hãy thêm các mục sau:


android:linksClickable="true"

android:autoLink="web"

4

Thêm CDATA vào tài nguyên chuỗi của bạn

Chuỗi tệp

<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>

3

Tôi sử dụng tính năng tự động xóa để "tự động gạch chân" văn bản, nhưng chỉ thực hiện một "onClick" quản lý nó. (Tôi đã gặp phải vấn đề này)

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:textSize="18dp"
            android:autoLink="all"
            android:text="@string/twitter"
            android:onClick="twitter"/>

public void twitter (View view)
    {
        try
        {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://twitter.com/onaclovtech"));
            startActivity(browserIntent);

        }
        finally
        {
        }
    }

Không yêu cầu bất kỳ quyền nào, vì bạn đang chuyển ý định sang các ứng dụng quản lý các tài nguyên đó, (trình duyệt IE).

Đây là những gì làm việc cho tôi. Chúc may mắn.


Bạn không tạo một liên kết có thể nhấp được, bạn chỉ cần đặt toàn bộ TextView có thể nhấp ... Đó không phải là câu hỏi.
clauziere

Đồng ý, nhưng đôi khi một cách giải quyết có hiệu quả, là điều tương tự. Rõ ràng 5 năm sau khi câu trả lời phổ biến nhất được viết, đây vẫn là một vấn đề, và đã 6 tháng rồi tôi cũng gặp vấn đề tương tự, nhưng cuối cùng lại có một giải pháp khác nhưng hiệu quả.
onaclov2000

2

Chỉ lãng phí quá nhiều thời gian để tìm ra bạn phải sử dụng getText (R.opes.whthing) thay vì getString (R.opes.whthing) ...

Dù sao, đây là cách tôi làm việc của tôi. Với nhiều siêu liên kết trong cùng một văn bản xem.

    TextView termsTextView = (TextView) getActivity().findViewById(R.id.termsTextView);
    termsTextView.append("By registering your account, you agree to our ");
    termsTextView.append(getText(R.string.terms_of_service));
    termsTextView.append(", ");
    termsTextView.append(getText(R.string.fees));
    termsTextView.append(", and the ");
    termsTextView.append(getText(R.string.stripe_connected_account_agreement));

    termsTextView.setMovementMethod(LinkMovementMethod.getInstance());



            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/termsTextView"/>

chuỗi ví dụ

    <string name="stripe_connected_account_agreement"><a href="https://stripe.com/connect/account-terms">Stripe Connected Account Agreement</a></string>

Điều này là rất nhiều đơn giản và dễ sử dụng. Tôi có nhiều liên kết với văn bản tùy chỉnh hoạt động trong TextView được thêm động vì điều này. Điều này cần các upvote nhất có thể. Đã phá vỡ đầu của tôi về các chuỗi được kéo dài, các phương pháp TextViews và HtmlCompat.fromHtml tùy chỉnh. Cảm ơn bạn rất nhiều @ luca992.
Parth Patel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.