Utwórz widok tekstu hiperłącza w systemie Android


80

Chcę utworzyć link do tekstu tekstowego, takiego jak Google . Czy w ogóle istnieje taki link. (tj.) Po kliknięciu słowa Google powinno otworzyć się odpowiedni link. Wszelkie pomysły są mile widziane.




1
po prostu użyj Linkify.addLinks (TextView, Linkify.ALL);
AndroidGeek

Odpowiedzi:


135

Spróbuj tego i daj mi znać, co się stało ...

Korzystanie z kodu java:

TextView textView =(TextView)findViewById(R.id.textView);
textView.setClickable(true);
textView.setMovementMethod(LinkMovementMethod.getInstance());
String text = "<a href='http://www.google.com'> Google </a>";
textView.setText(Html.fromHtml(text));

Od poziomu API> = 24 Html.fromHtml(String source)jest przestarzały, zamiast tego użyj fromHtml(String, int),

textView.setText(Html.fromHtml(text, Html.FROM_HTML_MODE_COMPACT));

Lub w pliku XML układu, wewnątrz atrybutów widgetu TextView

android:autoLink="web"
android:linksClickable="true"

mam oczekiwany wynik. Dzięki za odpowiedź
Srinivas,

1
Jeśli tekst hiperłącza znajduje się w pliku strings.xml, żadna z sugerowanych odpowiedzi nie działa. Działa w bardzo dziwny sposób. Jeśli ustawię tekst bezpośrednio w układzie xml, to działa, ale kiedy ustawię dane Textview w kodzie java, nie działa.
Velu

2
Wystarczy wspomnieć, że jeśli używasz kodu Java, musisz usunąć go android:autoLink="web"z XML. Miałem oba i to nie działało.
Αntonis Papadakis

53

użyj android:autoLink="web"w XML swojego TextView. Powinien automatycznie konwertować adresy URL, które można kliknąć (jeśli znajdują się w tekście)


14
Uwzględnij także android: linksClickable = "true"
Ajith Memana,

@waqaslam w tym przypadku, w którym umieściliśmy link.
Garg's

1
@ Garg's To tekst, który ustawiłeś w widoku tekstu, który może zawierać hiperłącza
waqaslam

28

Wszystkie przetestowane i działające 100%
rozwiązanie: android:autoLink="web"
poniżej znajduje się kompletny przykład

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

Ciąg w 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>

3
Nie działa, jeśli zmienię tę linię> cleverfinger.com.au/user-guide/ </a> </ string > dla innego tekstu, takiego jak: Kliknij tutaj
Musculaa

2
działa to tylko wtedy, gdy tekst zawiera pełny adres URL, taki jak: www.something.com
Rahul Tiwari

7

Można to również zrobić przy użyciu domyślnej właściwości Textview

android:autoLink="email"

5

Uwaga: - Html.fromHtml jest przestarzały w systemie Android N

Musisz sprawdzić i wsparcie Android Ni wyższe wersje Androida

                  //Set clickable true
                 tagHeading.setClickable(true);
                 
                  //Handlle click event
                  tagHeading.setMovementMethod(LinkMovementMethod.getInstance());

                if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
                    tagHeading.setText(Html.fromHtml("<a href='https://github.com/hiteshsahu'>https://github.com/hiteshsahu</a>", Html.FROM_HTML_MODE_LEGACY));
                } else {
                    tagHeading.setText(Html.fromHtml("<a href='https://github.com/hiteshsahu'>https://github.com/hiteshsahu</a>"));
                }
 

Alternatywnie

Możesz nie chcieć programowo dodawać flagi autoLink do programu TextView.

android: autoLink = "web"

android: linksClickable = "true"

W ten sposób nie musisz dodawać <a href='somelink'>tagów.

Co jest wadą, jeśli chcesz dodać hyperlinka text, nie możesz tego zrobić w ten sposób. np. nie możesz zrobić czegoś takiego: - [ hiteshsahu ] [1]

           <TextView
                android:id="@+id/tag_info"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/tag_ll"
                android:layout_gravity="left"
                android:layout_margin="10dp"
                android:autoLink="web"
                android:linksClickable="true"
                android:text="https://github.com/hiteshsahu"
                android:textColor="@color/secondary_text" />

Wynik obu podejść: -

https://github.com/hiteshsahu


1

Najnowsza wersja SDK fromHtmljest przestarzała Użyj poniższego wiersza

String yourtext = "<a style='text-decoration:underline' href='http://www.sample.com'> Sample Website </a>";
    if (Build.VERSION.SDK_INT >= 24) {
        textView.setText(Html.fromHtml(yourtext, Html.FROM_HTML_MODE_LEGACY));
    } else {
        textView.setText(Html.fromHtml(yourtext));
    }

0

Zrobiłem następującą funkcję rozszerzenia widoku tekstowego.

@SuppressLint("SetTextI18n")
fun TextView.makeHyperLink(url: String) {
    text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml("<a href='${url}'>${text}</a>", Html.FROM_HTML_MODE_COMPACT)
    } else {
        Html.fromHtml("<a href='${url}'>${text}</a>")
    }
    movementMethod = LinkMovementMethod.getInstance()
    isClickable = true
}

i nazywając to w ten sposób

tvTos.makeHyperLink(tos_url)

Możesz także przekazać tekst jako parametr.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.