วิธีสร้างลิงก์ใน TextView สามารถคลิกได้?


1003

ฉันได้กำหนด TextView ต่อไปนี้:

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

ซึ่งเป็นทรัพยากรที่มีสตริงที่ประกอบด้วย@string/txtCredits<a href="some site">Link text</a>

Android กำลังไฮไลต์ลิงก์ใน TextView แต่ไม่ตอบสนองต่อการคลิก มีคนบอกฉันว่าฉันทำอะไรผิดหรือเปล่า? ฉันต้องตั้ง onClickListener ให้กับ TextView ในกิจกรรมของฉันเพื่ออะไรที่ง่ายอย่างนี้หรือไม่?

ดูเหมือนว่าจะเกี่ยวข้องกับวิธีที่ฉันกำหนดทรัพยากรสตริงของฉัน สิ่งนี้ไม่ทำงาน:

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

แต่สิ่งนี้จะ:

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

อันไหนน่าเสียดายเพราะฉันอยากจะแสดงลิงค์ข้อความมากกว่าที่จะแสดง URL แบบเต็ม


67
android: autoLink = "web" นี่เป็นสายหลักที่ต้องเพิ่มลงใน xml และใช้งานได้อย่างมีเสน่ห์ ขอบคุณ @Richard
jeet.chanchawat

1
<string name = "txtCredits"> <a href=" google.com"> www.google.com </a> </ string > ใช้ sttring ด้านบนและใช้งานได้ มันได้เรียนรู้ว่าสตริงใน href และด้วยใน tag tag จะต้องเหมือนกันและมี. com หรือ. * ในการทำงานต้องตรวจสอบว่าทำไม
Shaik Khader

<string name = "txtCredits"> ข้อความบางส่วนที่นี่ <a href=" google.com"> Google </a> </ string > สำหรับตัวอย่างด้านบนคลิกที่ข้อความบางส่วนที่นี่ไม่ควรทำงานในกรณีของฉันฉันควรทำอย่างไร
Ajay Takur


android:focusable="true"แก้ไขปัญหาของฉัน
Khang .NT

คำตอบ:


1228

ฝังอยู่ในการสาธิต API ฉันพบวิธีแก้ปัญหาของฉัน:

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());

ฉันลบคุณลักษณะส่วนใหญ่ใน TextView ของฉันเพื่อให้ตรงกับสิ่งที่อยู่ในการสาธิต

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

นั่นแก้ไขได้ ค่อนข้างยากที่จะเปิดเผยและแก้ไข

สำคัญ : อย่าลืมที่จะเอาถ้าคุณกำลังเรียกร้องautoLink="web"setMovementMethod()


19
อาจเป็นเพียงฉัน แต่ทำไมคุณถึงต้องใช้ EditText?
Justin

1
ปรากฎว่าจำเป็นต้องมี setMovementMethod เท่านั้นเพื่อให้บรรลุเป้าหมาย
superarts.org

3
ฉันได้เห็น Samsung Galaxy S3 ที่มีระบบปฏิบัติการ 4.3 ที่ล้มเหลวเมื่อมีการใช้ "setMovementMethod (LinkMovementMethod.getInstance ())" ดังนั้นฉันต้องสร้างการตรวจสอบก่อนเพิ่ม
Jorge Aguilar

40
กันที่นี่ โปรดทราบว่าหากมีการเรียกใช้ setMovementMethod () คุณจำเป็นต้องลบ autolink = "web" ในไฟล์ XML มิฉะนั้นลิงก์อื่น ๆ จะไม่ทำงาน ขอบคุณสำหรับความคิดเห็น
voghDev

6
เพียงใช้แอตทริบิวต์ "autoLink" ใน xml ของคุณเช่น: android: autoLink = "web"
Kalpesh

533

ฉันใช้เพียงอย่างเดียวandroid:autoLink="web"และใช้งานได้ดี การคลิกที่ลิงค์จะเปิดเบราว์เซอร์และแสดงหน้าที่ถูกต้อง

สิ่งหนึ่งที่ฉันเดาได้ก็คือมุมมองอื่นอยู่เหนือลิงก์ สิ่งที่โปร่งใสจะเติมทั้งผู้ปกครองทั้งหมด แต่ไม่แสดงอะไรเลยเหนือลิงก์ ในกรณีนี้การคลิกจะไปที่มุมมองนี้แทนลิงก์


3
เพิ่มข้อมูลเพิ่มเติมด้านบน เป็นไปได้ไหมที่ฉันจะกำหนดสตริงเป็น <string name = "txtCredits"> <a href=" google.com"> Google </a> </ string > ดูเหมือนอนุญาตนี้ แต่มันไม่ทำงานสำหรับฉัน
ริชาร์ด

6
หากคุณใช้ linkify อัตโนมัติคุณไม่จำเป็นต้องมีส่วน href ระบบปฏิบัติการจะใช้สตริงในการแยกวิเคราะห์สำหรับ URL และแปลงทุก URL ให้เป็นลิงก์แบบคลิกได้ แต่สิ่งนี้จะไม่ส่งผลให้คำว่า google เชื่อมโยงกับ google.com มันจะแสดง www.google.com เป็นลิงก์
Janusz

การใช้การเชื่อมโยงอัตโนมัติทำงานได้อย่างสมบูรณ์แบบสำหรับฉันเช่นกันด้วย, มุมมองข้อความธรรมดาที่ไม่มีผู้ปกครอง
euther

2
android: autoLink ยังใช้งานได้ดีสำหรับการเชื่อมโยงหมายเลขโทรศัพท์ที่อยู่และที่อยู่อีเมล (หรือทั้งหมดข้างต้น)
CloudyMusic

54
ไม่มีก็ไม่ได้เพราะคำตอบนี้ไม่ทำงานถ้าคุณ wan't ที่จะใช้แท็กสมอที่มีแตกต่างกันแสดงข้อความจาก URL
cprcrack

375

หลังจากใช้เวลากับสิ่งนี้ฉันก็พบว่า:

  • android:autoLink="web"ใช้งานได้หากคุณมีลิงก์แบบเต็มใน HTML ของคุณ สิ่งต่อไปนี้จะถูกเน้นด้วยสีน้ำเงินและคลิกได้:
  • ข้อความบางส่วน <a href="http://www.google.com">http://www.google.com</a>
  • ข้อความบางส่วน http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance()); จะทำงานกับสิ่งต่อไปนี้ (จะถูกเน้นและคลิกได้):
  • ข้อความบางส่วน <a href="http://www.google.com">http://www.google.com</a>
  • ข้อความบางส่วน http://www.google.com
  • ข้อความบางส่วน <a href="http://www.google.com">Go to Google</a>

โปรดทราบว่าตัวเลือกที่สามมีการเชื่อมโยงหลายมิติ แต่คำอธิบายลิงก์ (ส่วนที่อยู่ระหว่างแท็ก) นั้นไม่ใช่ลิงก์ android:autoLink="web"ไม่ไม่ทำงานร่วมกับการเชื่อมโยงดังกล่าว

  • android:autoLink="web"หากตั้งค่าใน XML จะแทนที่view.setMovementMethod(LinkMovementMethod.getInstance());(เช่นลิงก์ประเภทที่สามจะถูกเน้น แต่ไม่สามารถคลิกได้)

คุณธรรมของเรื่องราวนั้นใช้view.setMovementMethod(LinkMovementMethod.getInstance());ในรหัสของคุณและตรวจสอบให้แน่ใจว่าคุณไม่มีandroid:autoLink="web"XML layout ของคุณหากคุณต้องการให้ทุกลิงก์สามารถคลิกได้


setMovementMethod ไม่สามารถใช้ได้กับตัวเลือกที่สองที่คุณพูดถึงเช่นgoogle.com .. การอัปเดตใด ๆ
Darpan

16
ขอขอบคุณที่ชี้ให้เห็นว่า<a href="http://www.google.com">Go to Google</a>จะไม่ทำงานกับลิงก์อัตโนมัติ สำหรับคำตอบมากมายเกี่ยวกับ SO นี่เป็นเพียงคำเดียวที่กล่าวถึง ขอบคุณ!
cwhsu

อันนี้ใช้ได้ผล ทดสอบกับ API 29
Wrichik Basu

96

การแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน แต่ต่อไปนี้ทำ (และดูเหมือนว่าจะสะอาดขึ้นเล็กน้อย)
ก่อนอื่นในทรัพยากรสตริงให้กำหนดเครื่องหมายบั้งการเปิดแท็กของคุณโดยใช้การเข้ารหัสเอนทิตี HTML คือ:

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

และไม่:

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

โดยทั่วไปแล้วเข้ารหัสบั้งทั้งหมดในสตริงเช่นนั้น BTW ลิงก์ต้องเริ่มต้นด้วยhttp://

จากนั้น (ตามที่แนะนำที่นี่ ) ตั้งค่าตัวเลือกนี้ใน TextView ของคุณ:

 android:linksClickable="true"

ในที่สุดในรหัสทำ:

((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)));

แค่นั้นแหละไม่ต้องใช้ regexes หรือแฮ็คคู่มืออื่น ๆ


7
สิ่งนี้จะสร้างตัวแยกวิเคราะห์ HTML ทุกครั้งที่มีการเรียกใช้โค้ดนี้ โปรดทราบว่าหากคุณใช้สิ่งนี้เพื่อสร้างลิงก์ภายในรายการหรือที่สถานที่สำคัญอื่น ๆ ในแอพของคุณ ในระหว่างการสร้าง listemem มันจะเพิ่มเวลาในการประมวลผลของ getView methods ลดลง 50%
Janusz

1
และต้องแทนที่ช่องว่างใน URL ด้วย%20
Nicolas Tyler

คุณสามารถหลีกเลี่ยงปัญหาการเข้ารหัสเอนทิตีโดยการใส่สตริงของคุณใน<![CDATA[ ... ]]>แท็ก
Paul Lammertsma

1
ทำงานให้ฉันขอบคุณ ไม่ทำงานกับ<![CDATA[...]]>แท็ก
ricky.tribbia

นี่ควรเป็นคำตอบ! ทำงานได้ดีอย่างสมบูรณ์แบบด้วยแอพพื้นเมืองของฉัน
Ajay Kulkarni

68

ฉันใช้สิ่งนี้เพียง

Linkify.addLinks(TextView, Linkify.ALL);

ทำให้ลิงก์สามารถคลิกได้ที่นี่


4
คำตอบนี้ดีที่สุด ใช้งานได้กับทุกรุ่น Android และเราเพียงแค่ต้องเพิ่มวิธีการนั้นเมื่อข้อความในชุดใน TextView โบนัส: ช่วยให้เราสามารถเพิ่มลิงค์ที่ปรับแต่งได้ซึ่งสามารถคลิกได้
Kerwan

3
คำตอบที่ง่ายที่สุดและดีที่สุดจริงๆ มันใช้งานได้กับอีเมล / เว็บในเวลาเดียวกัน .... ขอบคุณผู้ชาย !!!
Imran Ahmed

1
ใช้ LinkifyCompat ถ้าคุณต้องการบางส่วนของคุณสมบัติขั้นสูงใหม่
Vaiden

ดีมันทำให้ URL โดยไม่ต้อง<a href...คลิกได้
Pavel

นอกจากนี้ยังทำให้แท็ก "html" ทั้งหมดทำงานภายในเช่น <b> ... </b> ฯลฯ
อาร์เรย์

67

หากคุณต้องการเพิ่มลิงค์เหมือน HTML สิ่งที่คุณต้องทำคือ:

  • เพิ่มสตริงเหมือน HTML ของทรัพยากร:

     <string name="link"><a href="https://www.google.pl/">Google</a></string>
  • เพิ่มมุมมองของคุณไปยังเลย์เอาต์โดยไม่มีการกำหนดค่าเฉพาะลิงก์เลย:

     <TextView
        android:id="@+id/link"
        android:text="@string/link" />`
  • เพิ่ม MovementMethod ที่เหมาะสมโดยทางโปรแกรมให้กับ TextView ของคุณ:

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

แค่นั้นแหละ! และใช่การมีตัวเลือกเช่น "autoLink" และ "linksClickable" ที่ทำงานกับลิงก์อย่างชัดเจนเท่านั้น (ไม่รวมอยู่ในแท็ก html) ทำให้ฉันเข้าใจผิดมากเช่นกัน ...


2
+1 คุณพูดถูก ควรมีตัวเลือกในการป้อนรูปแบบของคุณเองเพื่อให้ตรงกับนี้ วิธีนี้มันจะค่อนข้างโง่
schlingel

47

ฉันเพิ่มบรรทัดนี้ในTextView: android:autoLink="web"
ด้านล่างเป็นตัวอย่างการใช้งานในไฟล์เลย์เอาต์

layout.xml ตัวอย่าง

    <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

ข้อมูลต่อไปนี้ควรใช้กับทุกคนที่กำลังมองหาการผสมผสานระหว่างข้อความและไฮเปอร์ลิงก์ภายในแอพ Android

ใน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>

ตอนนี้คุณสามารถใช้สิ่งนี้stringในสิ่งที่ได้รับViewเช่นนี้:

<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"/>

ในกิจกรรมหรือส่วนของคุณให้ทำดังนี้

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

ถึงตอนนี้คุณไม่จำเป็นต้องตั้งค่าandroid:autoLink="web"หรือandroid:linksClickable="true"ใช้วิธีนี้

ฉันหวังว่าคุณจะเป็นประโยชน์


วิธีนี้ใช้งานได้ดี แต่เมื่อคุณกดกลับจากเว็บที่เปิดอยู่ให้ปิดเบราว์เซอร์เท่านั้น แต่ไม่กลับสู่แอป
Jachumbelechao Unto Mantekilla

27

ฉันหวังว่านี่จะช่วยคุณได้

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
มันใช้งานได้ดี นอกจากนี้ยังให้แน่ใจว่าคุณเอาจากคุณandroid:autoLink=? TextView
sulai

นี่คือสิ่งที่ได้ผลในที่สุดสำหรับฉัน HTML ที่ถูกต้องและไม่ได้ใช้android:autoLink=?เป็นสิ่งสำคัญ!
Neal Sanche

สำหรับ Xamarin คำจะแสดง แต่ไม่ได้ขีดเส้นใต้และไม่สามารถคลิกได้โดยใช้พารามิเตอร์ด้านบนและไม่ใช่พารามิเตอร์เหล่านี้: autoLink, links คลิกได้
maxweber

สำหรับ Xamarin การตั้งค่าเหล่านั้นและการตั้งค่าข้อความหรือการตั้งค่า TextFormatted ยังให้ผลคำ แต่ไม่สามารถคลิกได้หรือฟ้า / ขีดเส้นใต้ การลบ autoLink ก็ล้มเหลวเช่นกัน การลบเฉพาะลิงก์คลิกได้ก็ล้มเหลวเช่นกัน การลบทั้งคู่ก็ล้มเหลวเช่นกัน
maxweber

helloWorld.TextFormatted = Html.FromHtml (linkURL); มีและไม่มีเหล่านั้นก็ล้มเหลว (ไม่ได้เชื่อมโยงไม่ใช่สีน้ำเงินไม่สามารถคลิกได้)
maxweber

25

เฉพาะสิ่งที่คุณต้องการเพิ่มในมุมมองข้อความใน xml

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

24

สิ่งที่ง่ายที่สุดสำหรับฉันคือใช้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);

และมันจะตรวจจับ URL ของเว็บจากข้อความในมุมมองข้อความโดยอัตโนมัติ


จริง แต่จะไม่สามารถคลิกได้
FractalBob

ลิงก์สามารถคลิกได้
Octavian Ionel

19

Richard ครั้งต่อไปคุณควรเพิ่มรหัสนี้ใน TextView ที่ XML layout แทน

android:autoLink="all"

นี่ควรเป็นแบบนี้

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

คุณไม่จำเป็นต้องใช้รหัสนี้ ( t2.setMovementMethod(LinkMovementMethod.getInstance());) เพื่อให้ลิงก์คลิกได้

นอกจากนี้ที่นี่ความจริง: ตราบใดที่คุณตั้งค่าautoLinkและlinksClickableไม่ลืมที่จะเพิ่มนี้ที่String.xmlไฟล์เพื่อให้ลิงค์จะทำงาน

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

3
ไม่ได้ผลสำหรับฉัน ลิงก์สามารถคลิกได้จริง แต่สตริงทั้งหมดจะปรากฏไม่ใช่แค่ "Google" ในความเป็นจริงไม่มีคำตอบที่นี่หรือการรวมกันดังกล่าวทำงานจน
ยีราฟสีม่วง

อุปกรณ์ของคุณหรืออินเทอร์เน็ตอีมูเลเตอร์เปิดใช้งานและตั้งค่าเป็นเปิด (WiFi) หรือมีการเชื่อมต่อ LAN @Violet Giraffe หรือไม่
David Dimalanta

มันคือ. ฉันไม่เคยจัดการเพื่อให้ลิงก์ที่สามารถคลิกได้โดยใช้เพียงแอตทริบิวต์ XML ต้องหันไปใช้โค้ด Java สำหรับสิ่งนั้น ซึ่งไม่ใช่เรื่องใหญ่ แต่ไม่ดี
Violet Giraffe

18

โดยใช้linkify : Linkifyนำข้อความและนิพจน์ทั่วไปและเปลี่ยน regex ที่ตรงกันทั้งหมดในข้อความให้เป็นลิงก์แบบคลิกได้

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

อย่าลืม

import android.widget.TextView;

16

นี่คือรหัส Android หนึ่งบรรทัดเพื่อให้สามารถเลือกโทรศัพท์และ url ได้จาก textView ไม่ว่าสตริงและข้อมูลคืออะไร คุณไม่จำเป็นต้องใช้แท็ก HTML สำหรับสิ่งนี้

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

ฉันสังเกตเห็นว่าใช้android:autoLink="web"ดังนั้น

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

ทำงานได้ดีสำหรับ URL แต่เนื่องจากฉันมีที่อยู่อีเมลและหมายเลขโทรศัพท์ที่ฉันต้องการเชื่อมโยงด้วยฉันจึงลงเอยด้วยการใช้บรรทัดandroid:autoLink="all"นี้เช่นนี้

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

และมันใช้งานได้อย่างมีเสน่ห์


13

จัดการ Linkify ข้อความสีด้วย ป้อนคำอธิบายรูปภาพที่นี่

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

ให้แน่ใจว่าจะไม่ใช้setAutoLinkMask(Linkify.ALL)เมื่อใช้setMovementMethod(LinkMovementMethod.getInstance())และHtml.fromHTML()ในรูปแบบที่ถูกHTMLเชื่อมโยง (ตัวอย่าง<a href="http://www.google.com/">Google</a>)


10

ใช้สิ่งนี้ ...

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

                });

และเพิ่มสิทธิ์ในไฟล์ Manifest

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

1
สิ่งนี้จะใช้งานได้ แต่โปรดจำไว้ว่าแอปอาจไม่ต้องการการอนุญาตทางอินเทอร์เน็ตนอกเหนือจาก TextView ที่คลิกได้นี้ อาจ overkill ในกรณีเหล่านั้น
Jose_GD

2
มันเกี่ยวข้องกับคำถามจริงๆเหรอ?
Darpan

2
สิ่งนี้ไม่เกี่ยวข้องกับคำถาม
afollestad

1
สิ่งนี้จะไม่ล้มเหลว!
Skynet

ฉันชอบวิธีนี้เพราะมันช่วยให้เรามีเพียงสมอข้อความแสดงแทนที่จะเป็น URL แบบเต็ม ข้อความสมอยังสามารถจัดรูปแบบเช่นสีเขียวและขีดเส้นใต้
สูญเสียลูก

10

คุณต้องการเพียงสิ่งนี้:

android:autoLink="web"

แทรกบรรทัดนี้ไปที่ TextView ที่สามารถคลิกได้โดยอ้างอิงกับเว็บ ที่อยู่ URL ที่ตั้งเป็นข้อความของ TextView นี้

ตัวอย่าง:

 <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

คำตอบที่ยอมรับนั้นถูกต้อง แต่จะหมายถึงหมายเลขโทรศัพท์แผนที่ที่อยู่อีเมลและลิงก์ปกติเช่น http://google.comไม่มีแท็ก href จะไม่สามารถคลิกได้อีกต่อไปเนื่องจากคุณไม่สามารถมี autolink ใน xml ได้

โซลูชั่นที่สมบูรณ์แบบเดียวที่ให้ทุกอย่างสามารถคลิกได้ที่ฉันได้พบคือ:

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());

และ TextView android:autolinkไม่ควรมี ไม่จำเป็นต้องมีandroid:linksClickable="true"ทั้ง; มันเป็นความจริงโดยค่าเริ่มต้น


สำหรับฉันมันใช้งานได้โดยไม่ต้องตอบคำถามที่ได้รับการยอมรับทำงานได้ดี @ เคลลี่คุณสามารถบอกรุ่น Android และอุปกรณ์ที่คุณมีปัญหาได้หรือไม่?
Akhil Dad

ใช้ไม่ได้กับmyapp://โครงร่าง (สำหรับการเชื่อมโยงลึก)
CoolMind

7

นี่คือวิธีที่ฉันแก้ไขลิงก์ที่คลิกได้และเห็นได้ใน TextView (ตามรหัส)

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

แต่ฉันต้องการที่จะเห็นข้อความและเมื่อคลิกที่ข้อความมันเปลี่ยนเส้นทางไปยังลิงค์ (เปิดโดยเบราว์เซอร์)? โซลูชันนี้ไม่ได้แก้ปัญหานั้นใช่ไหม
Duc Tran

6

ใช้รหัสด้านล่าง:

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]

คุณสามารถรับสตริง HTML ของคุณจากแบ็กเอนด์หรือจากไฟล์ทรัพยากรของคุณ หากคุณใส่ข้อความของคุณเป็นสตริงของทรัพยากรให้เพิ่มCDATAแท็ก:

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

จากนั้นในรหัสคุณจะต้องได้รับสตริงและกำหนดเป็น HTML และตั้งค่าวิธีการเคลื่อนไหวของลิงค์:

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

สาเหตุที่คุณมีปัญหาคือพยายามจับคู่ที่อยู่ "เปลือย" เท่านั้น สิ่งต่างๆเช่น "www.google.com" หรือ " http://www.google.com "

ใช้ข้อความของคุณผ่านHtml.fromHtml ()ควรทำเคล็ดลับ คุณต้องทำแบบเป็นทางการ แต่ใช้งานได้


2
ลิงก์ใน TextView มีสีแตกต่างจากข้อความอื่น ๆ ในสตริงดังนั้นฉันคิดว่าพวกเขากำลังได้รับการยอมรับว่าเป็นลิงก์ มันไม่สามารถคลิกได้ :-(
Richard

4

ไม่ทราบว่ามันมีค่าเพิ่มคำตอบอื่น แต่ในกรณี ...

ฉันต้องตามล่ามันในสถานที่สองแห่ง แต่ในที่สุดก็ได้รหัสนี้มาใช้งาน

strings.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 (ใน 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());

สิ่งนี้จะสร้างการเชื่อมโยงหลายมิติที่คลิกได้ด้วยข้อความlink text1และlink text2เปลี่ยนเส้นทางผู้ใช้ไปยัง google


4

โทรศัพท์ Autolink ใช้งานไม่ได้สำหรับฉัน งานต่อไปนี้เป็นเหมือนมนต์เสน่ห์

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

หากใช้ XML ตาม TextView สำหรับความต้องการของคุณคุณต้องทำสองสิ่ง:

  1. ระบุลิงก์ของคุณในสตริงเช่น "นี่คือหน้าเว็บของฉัน" คุณสามารถเพิ่มได้ใน xml หรือในรหัส

  2. ใน xml ที่มี TextView ให้เพิ่มสิ่งเหล่านี้:


android:linksClickable="true"

android:autoLink="web"

4

เพิ่ม CDATA ให้กับทรัพยากรสตริงของคุณ

strings.xml

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

3

ฉันใช้การลิงก์อัตโนมัติเพื่อ "ขีดเส้นใต้อัตโนมัติ" ข้อความ แต่เพิ่งสร้าง "onClick" ที่จัดการมัน (ฉันพบปัญหานี้ด้วยตัวเอง)

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

ไม่ต้องการการอนุญาตใด ๆ เนื่องจากคุณกำลังส่งผ่านความตั้งใจไปยังแอปที่จัดการทรัพยากรเหล่านั้น (เบราว์เซอร์ IE)

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน โชคดี.


คุณไม่ได้สร้างลิงค์ที่คลิกได้คุณเพียงแค่ใส่ TextView ทั้งหมดที่คลิกได้ ... นั่นไม่ใช่คำถาม
clauziere

เห็นด้วย แต่บางครั้งวิธีแก้ปัญหาที่ได้ผลก็เหมือนกัน เห็นได้ชัดว่า 5 ปีหลังจากเขียนคำตอบที่ได้รับความนิยมมากที่สุดนี่ก็ยังเป็นปัญหาอยู่และเป็นเวลา 6 เดือนที่ฉันมีปัญหาเดียวกัน แต่จบลงด้วยวิธีการแก้ปัญหาที่แตกต่าง แต่ทำงานได้
onaclov2000

2

เพียงเสียเวลามากในการคิดว่าคุณต้องใช้ getText (R.string.whething) แทน getString (R.string.whething) ...

อย่างไรก็ตามนี่คือวิธีที่ฉันได้ทำงานของฉัน ด้วยการเชื่อมโยงหลายมิติในมุมมองข้อความเดียวกันด้วย

    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"/>

ตัวอย่างสตริง

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

นี่คือสิ่งที่ตรงไปตรงมามากขึ้นและใช้งานง่าย ฉันมีหลายลิงค์ที่มีข้อความที่กำหนดเองที่ทำงานใน TextView ที่เพิ่มเข้ามาแบบไดนามิกเพราะสิ่งนี้ สิ่งนี้ต้องการ upvotes มากที่สุด รับหัวของฉันมากกว่าสตริง Spanned วิธีการ TextViews ที่กำหนดเองและ HtmlCompat.fromHtml ขอบคุณมาก @ luca992
Parth Patel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.