Wie mache ich Links in einer TextView anklickbar?

1003

Ich habe die folgende Textansicht definiert:

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

Wo @string/txtCreditsist eine String-Ressource, die enthält <a href="some site">Link text</a>.

Android hebt die Links in der Textansicht hervor, sie reagieren jedoch nicht auf Klicks. Kann mir jemand sagen, was ich falsch mache? Muss ich in meiner Aktivität einen onClickListener für die Textansicht festlegen, um so etwas Einfaches zu erreichen?

Sieht so aus, als hätte es damit zu tun, wie ich meine String-Ressource definiere. Das funktioniert nicht:

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

Aber das tut:

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

Das ist ein Mist, weil ich lieber einen Textlink als die vollständige URL anzeigen würde.

Richard
quelle
67
android: autoLink = "web" Dies ist die Hauptzeile, die zu XML hinzugefügt werden muss und es funktioniert wie Charme. danke @Richard
jeet.chanchawat
1
<string name = "txtCredits"> <a href=" google.com"> www.google.com </a> </ string > Verwenden Sie den obigen String und es funktioniert. Es wird gelernt, dass die Zeichenfolge in href und mit in anchor Tag gleich sein muss und .com oder. * Haben muss, um zu überprüfen, warum
Shaik Khader
<string name = "txtCredits"> Text hier <a href=" google.com"> Google </a> </ string > Für den obigen Ausschnitt Klicken Sie auf Einige Texte hier sollten in meinem Fall nicht funktionieren. Was soll ich tun?
Ajay Takur
versuchen Sie es mit github.com/ajaysahani/MultiActionTextView
Jawad Zeb
android:focusable="true"löste mein Problem
Khang .NT

Antworten:

1228

In den API-Demos vergraben fand ich die Lösung für mein Problem:

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

Ich habe die meisten Attribute in meiner Textansicht entfernt, um sie an die Demo anzupassen.

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

Das hat es gelöst. Ziemlich schwer aufzudecken und zu reparieren.

Wichtig : Vergessen Sie nicht zu entfernen, autoLink="web"wenn Sie anrufen setMovementMethod().

Richard
quelle
19
Vielleicht bin ich es nur, aber warum würdest du das jemals mit einem EditText machen?
Justin
1
Es stellt sich heraus, dass nur setMovementMethod benötigt wird, um das Ziel zu erreichen.
Superarts.org
3
Nur als Kommentar habe ich einige Samsung Galaxy S3 mit OS 4.3 gesehen, die abstürzen, wenn die "setMovementMethod (LinkMovementMethod.getInstance ())" verwendet wird. Berücksichtigen Sie dies einfach, ich musste eine Validierung erstellen, bevor ich sie hinzufügte
Jorge Aguilar
40
Hier gilt das gleiche. Beachten Sie, dass beim Aufruf von setMovementMethod () autolink = "web" in der XML-Datei entfernt werden muss, da sonst der Link nicht funktioniert. Danke für den Kommentar
voghDev
6
Verwenden Sie einfach das Attribut "autoLink" in Ihrer XML für zB: android: autoLink = "web"
Kalpesh
533

Ich benutze nur android:autoLink="web"und es funktioniert gut. Ein Klick auf den Link öffnet den Browser und zeigt die richtige Seite.

Eine Sache, die ich vermuten könnte, ist, dass sich eine andere Ansicht über dem Link befindet. Etwas, das transparent ist, füllt das gesamte übergeordnete Element aus, zeigt jedoch nichts über dem Link an. In diesem Fall wechselt der Klick zu dieser Ansicht anstelle des Links.

Janusz
quelle
3
Weitere Informationen oben hinzugefügt. Könnte es sein, wie ich die Zeichenfolge als <string name = "txtCredits"> <a href=" google.com"> Google </a> </ string > definiere? Sieht so aus, als wäre das erlaubt, aber es funktioniert bei mir nicht.
Richard
6
Wenn Sie linkify auto verwenden, benötigen Sie den a href-Teil nicht. Das Betriebssystem analysiert anhand der Zeichenfolge URLs und konvertiert jede URL in einen anklickbaren Link. Dies führt jedoch nicht dazu, dass das Wort Google mit google.com verknüpft wird. Es würde www.google.com als Link anzeigen.
Janusz
Die Verwendung von Autolink funktioniert auch perfekt für mich, einfache Textansicht ohne Eltern.
euther
2
android: autoLink eignet sich auch hervorragend zum Verknüpfen von Telefonnummern, Adressen und E-Mail-Adressen (oder allen oben genannten).
CloudyMusic
54
Nein, ist es nicht, weil diese Antwort nicht funktioniert, wenn Sie kein Ankertag mit einem anderen Anzeigetext als der URL verwenden
möchten
375

Nachdem ich einige Zeit damit verbracht habe, habe ich Folgendes festgestellt:

  • android:autoLink="web"funktioniert, wenn Sie vollständige Links in Ihrem HTML haben. Folgendes wird blau hervorgehoben und kann angeklickt werden:
  • Etwas Text <a href="http://www.google.com">http://www.google.com</a>
  • Etwas Text http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance()); funktioniert mit folgenden Funktionen (wird hervorgehoben und anklickbar):
  • Etwas Text <a href="http://www.google.com">http://www.google.com</a>
  • Etwas Text http://www.google.com
  • Etwas Text <a href="http://www.google.com">Go to Google</a>

Beachten Sie, dass die dritte Option einen Hyperlink enthält, die Beschreibung des Links (der Teil zwischen den Tags) selbst jedoch kein Link ist. android:autoLink="web"funktioniert NICHT mit solchen Links.

  • android:autoLink="web"Wenn in XML festgelegt, wird überschrieben view.setMovementMethod(LinkMovementMethod.getInstance());(dh Links der dritten Art werden hervorgehoben, können aber nicht angeklickt werden).

Die Moral der Geschichte ist die Verwendung view.setMovementMethod(LinkMovementMethod.getInstance());in Ihrem Code und stellen Sie sicher, dass Sie nicht android:autoLink="web"in Ihrem XML-Layout haben, wenn Sie möchten, dass alle Links anklickbar sind.

Jeshurun
quelle
setMovementMethod funktioniert nicht mit der zweiten Option, die Sie erwähnt haben, z. B. google.com . Gibt es ein Update?
Darpan
16
Vielen Dank für den Hinweis, dass <a href="http://www.google.com">Go to Google</a>dies bei autoLink nicht funktioniert. Für so viele Antworten auf SO ist dies die einzige, die es erwähnt hat. Vielen Dank!
cwhsu
Dieser funktioniert. Getestet auf API 29.
Wrichik Basu
96

Die oben genannten Lösungen haben bei mir nicht funktioniert, aber die folgenden haben funktioniert (und es scheint ein bisschen sauberer zu sein).
Definieren Sie zunächst in der Zeichenfolgenressource die Chevrons zum Öffnen von Tags mithilfe der HTML-Entitätscodierung, dh:

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

und nicht:

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

Codieren Sie im Allgemeinen alle Chevrons in der Zeichenfolge so. Übrigens muss der Link mit beginnenhttp://

Stellen Sie dann (wie hier vorgeschlagen ) diese Option in Ihrer Textansicht ein:

 android:linksClickable="true"

Führen Sie schließlich im Code Folgendes aus:

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

Das war's, keine regulären Ausdrücke oder andere manuelle Hacks erforderlich.

Błażej Czapp
quelle
7
Dadurch wird bei jeder Ausführung dieses Codes ein HTML-Parser erstellt. Beachten Sie dies, wenn Sie damit Links in einem Listenelement oder an anderen leistungskritischen Stellen in Ihrer App erstellen. Während der Erstellung eines Listenelements erhöht dies die Ausführungszeit meiner getView-Methoden um 50%
Janusz
1
Beachten Sie auch, dass Leerzeichen in der URL durch%20
Nicolas Tyler
Sie können Probleme mit der Entitätscodierung vermeiden, indem Sie Ihre Zeichenfolge in das <![CDATA[ ... ]]>Tag einschließen.
Paul Lammertsma
1
ARBEITET für mich, danke. Arbeitet nicht mit <![CDATA[...]]>Tag.
Ricky.tribbia
Dies sollte die Antwort sein! Funktionierte perfekt mit meiner nativen App
Ajay Kulkarni
69

Ich habe das einfach benutzt

Linkify.addLinks(TextView, Linkify.ALL);

macht die hier anklickbaren Links anklickbar

jai_b
quelle
4
Diese Antwort ist die beste. Funktioniert auf jeder Android-Version und wir müssen diese Methode nur hinzufügen, wenn der Text in der Textansicht festgelegt ist. Bonus: Es ermöglicht uns, anpassbare Links hinzuzufügen, die anklickbar sind
Kerwan
3
Wirklich einfachste und beste Antwort. es funktioniert gleichzeitig für E-Mail / Web .... danke Mann !!!
Imran Ahmed
1
Verwenden Sie LinkifyCompat, wenn Sie einige der neueren erweiterten Funktionen
benötigen
Gut, es macht URLs ohne <a href...anklickbar
Pavel
Außerdem funktionieren alle darin enthaltenen "HTML" -Tags entsprechend, z. B. <b> ... </ b> usw.
Array
67

Wenn Sie einen HTML-ähnlichen Link hinzufügen möchten, müssen Sie lediglich Folgendes tun:

  • Fügen Sie eine HTML-ähnliche Zeichenfolge für Ressourcen hinzu:

     <string name="link"><a href="https://www.google.pl/">Google</a></string>
  • Fügen Sie Ihre Ansicht dem Layout ohne linksspezifische Konfiguration hinzu:

     <TextView
        android:id="@+id/link"
        android:text="@string/link" />`
  • Fügen Sie Ihrer TextView programmgesteuert die entsprechende MovementMethod hinzu:

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

Das ist es! Und ja, Optionen wie "autoLink" und "linksClickable", die nur an expliziten Links arbeiten (nicht in HTML-Tags eingeschlossen), sind für mich auch sehr irreführend ...

nämlich
quelle
2
+1 Du hast recht. Es sollte eine Option geben, ein Muster selbst einzugeben, damit dieses übereinstimmt. Auf diese Weise ist es ziemlich dumm.
Schlingel
47

Ich habe diese Zeile hinzugefügt zu TextView: android:autoLink="web"
Unten finden Sie ein Beispiel für die Verwendung in einer Layoutdatei.

layout.xml Stichprobe

    <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:[email protected]?Subject=Lost%20Password" target="_top">[email protected]</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>
Shanewaj
quelle
36

Das Folgende sollte für alle funktionieren, die nach einer Kombination aus Text und Hyperlink in einer Android-App suchen.

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

Jetzt können Sie dies nutzen string in jeder gegebenen Viewwie folgt aus :

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

Führen Sie nun in Ihrer Aktivität oder Ihrem Fragment Folgendes aus:

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

Inzwischen müssen Sie nicht mehr einstellen android:autoLink="web"android:linksClickable="true" diesen Ansatz oder verwenden.

Ich hoffe, Sie finden das hilfreich.

Asesha George
quelle
Dies funktioniert gut, aber wenn Sie aus dem geöffneten Web zurück drücken, schließen Sie nur den Browser, aber kehren Sie nicht zur App zurück.
Jachumbelechao bis Mantekilla
27

Ich hoffe, dies wird dir helfen;

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());
Bebin TN
quelle
3
Das funktioniert super. Stellen Sie außerdem sicher, dass Sie android:autoLink=?von Ihrem entfernen TextView.
Sulai
Das hat endlich bei mir funktioniert. Gültiges HTML und Nichtverwendung android:autoLink=?ist wichtig!
Neal Sanche
Für Xamarin wird das Wort angezeigt, ist aber nicht unterstrichen und kann nicht mit den oben genannten und NICHT mit den folgenden Parametern angeklickt werden: autoLink, linksClickable
maxweber
Wenn Sie diese Xamarin-Einstellungen vornehmen und Text oder TextFormatted festlegen, wird das Wort ebenfalls angezeigt, es ist jedoch weder anklickbar noch blau / unterstrichen. Das Entfernen des AutoLinks schlägt ebenfalls fehl. Das Entfernen nur von linksClickable schlägt ebenfalls fehl. Das Entfernen von beiden schlägt ebenfalls fehl.
Maxweber
helloWorld.TextFormatted = Html.FromHtml (linkURL); mit und ohne scheitert auch. (nicht verlinkt, nicht blau, kann nicht angeklickt werden)
Maxweber
25

Nur was brauchen Sie, um dies in der Textansicht in XML hinzuzufügen

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autoLink="web"/>
Ahmed Mostafa
quelle
24

Das Einfachste, was für mich funktioniert hat, ist die Verwendung von 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);

und es erkennt automatisch die Web-URLs aus dem Text in der Textansicht.

pks
quelle
Stimmt, aber sie können nicht angeklickt werden.
FractalBob
Die Links sind anklickbar.
Octavian Ionel
19

Richard, beim nächsten Mal sollten Sie diesen Code stattdessen unter TextView im Layout-XML hinzufügen.

android:autoLink="all"

Das sollte so sein.

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

Sie müssen diesen Code nicht verwenden (t2.setMovementMethod(LinkMovementMethod.getInstance()); ) nicht verwenden, um den Link anklickbar zu machen.

Hier ist auch die Wahrheit: Solange Sie den autoLink und die linksClickable festlegen , vergessen Sie nicht, diese in der Datei String.xml hinzuzufügen, damit der anklickbare Link funktioniert.

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>
David Dimalanta
quelle
3
Funktioniert bei mir nicht Der Link ist zwar anklickbar, aber die gesamte Zeichenfolge wird angezeigt, nicht nur "Google". Tatsächlich funktioniert bisher keine der Antworten hier oder eine Kombination davon.
Violette Giraffe
Ist Ihr Gerät oder Emulator im Internet aktiviert und auf ON (WLAN) eingestellt oder ist eine LAN-Verbindung hergestellt, @Violet Giraffe?
David Dimalanta
Es ist. Ich habe es nie geschafft, Links nur mit XML-Attributen anklickbar zu machen, musste dafür auf Java-Code zurückgreifen. Welches ist keine große Sache, aber nicht schön.
Violette Giraffe
18

mithilfe von linkify : Linkify verwendet einen Text und einen regulären Ausdruck und wandelt alle Regex-Übereinstimmungen im Text in anklickbare Links um

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

Vergiss es nicht

import android.widget.TextView;
DeathRs
quelle
16

Hier ist ein einzeiliger Android-Code, mit dem Telefon und URL in textView ausgewählt werden können, unabhängig davon, was Zeichenfolge und was Daten sind. Sie müssen hierfür keine HTML-Tags verwenden.

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);
Rahul Raina
quelle
13

Mir ist aufgefallen, dass mit android:autoLink="web"so

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

funktionierte für URLs in Ordnung, aber da ich eine E-Mail-Adresse und eine Telefonnummer hatte, die ich ebenfalls verknüpfen wollte, habe ich diese Zeile android:autoLink="all"wie folgt verwendet

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

und es funktionierte wie ein Zauber.

aLerner
quelle
13

Verwalten der Linkify-Textfarbe auch Geben Sie hier die Bildbeschreibung ein

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 );
Keshav Gera
quelle
11

Achten Sie darauf, nicht verwenden setAutoLinkMask(Linkify.ALL)bei der Verwendung setMovementMethod(LinkMovementMethod.getInstance())und Html.fromHTML()auf richtig formatiert HTMLLinks (zum Beispiel <a href="http://www.google.com/">Google</a>).

elffünf
quelle
10

Benutze das...

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

                });

und fügen Sie die Berechtigung in die Manifestdatei ein

<uses-permission android:name="android.permission.INTERNET"/>
Tej
quelle
1
Dies funktioniert, aber denken Sie daran, dass die App möglicherweise keine Internetberechtigung über diese anklickbare Textansicht hinaus benötigt. Vielleicht übertrieben in diesen Fällen
Jose_GD
2
Bezieht es sich wirklich auf die Frage?
Darpan
2
Dies war für die Frage nicht relevant.
Afollestad
1
Das wird niemals scheitern!
Skynet
Ich mag diese Methode, da wir nur den Ankertext und nicht die vollständige URL anzeigen können. Der Ankertext kann auch zB grün und unterstrichen gestaltet werden.
Baby
10

Sie brauchen nur das:

android:autoLink="web"

Fügen Sie diese Zeile in TextView ein, die mit Bezug auf das Web angeklickt werden kann. URL-Adresse als Text dieser Textansicht festgelegt.

Beispiel:

 <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" />
Androdos
quelle
10

Die akzeptierte Antwort ist korrekt, ABER es bedeutet, dass Telefonnummern, Karten, E-Mail-Adressen und reguläre Links, z. B. http://google.comohne href-Tags, NICHT MEHR anklickbar sind, da Sie keinen automatischen Link in der XML haben können.

Die einzige vollständige Lösung, mit der ALLES, was ich gefunden habe, anklickbar ist, ist die folgende:

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

Und die TextView sollte NICHT haben android:autolink. Es besteht auch keine Notwendigkeit dafür android:linksClickable="true"; Es ist standardmäßig wahr.

Kelly McKinnon
quelle
für mich hat es ohne das geklappt, die akzeptierte Antwort hat gut funktioniert @Kelly Kannst du die Android-Version und das Gerät sagen, auf dem du das Problem hast?
Akhil Dad
Funktioniert nicht für myapp://Schemata (für Deep Linking).
CoolMind
7

So löste ich klickbare und sichtbare Links in einer Textansicht (per Code)

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>"));
    }
Dominic Bartl
quelle
aber ich möchte den Text sehen und wenn ich auf den Text klicke, wird er zum Link weitergeleitet (vom Browser geöffnet)? Diese Lösung löst das nicht, oder?
Duc Tran
6

Verwenden Sie den folgenden Code:

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));
Phuc Tran
quelle
6

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

Sie können Ihre HTML-Zeichenfolge aus dem Backend oder aus Ihren Ressourcendateien abrufen. Wenn Sie Ihren Text als Ressourcenzeichenfolge einfügen, müssen Sie das folgende CDATATag hinzufügen :

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

Dann müssen Sie im Code die Zeichenfolge abrufen, als HTML zuweisen und eine Linkbewegungsmethode festlegen:

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.
}
Benny
quelle
5

Der Grund, warum Sie das Problem haben, ist, dass nur versucht wird, "nackte" Adressen zu finden. Dinge wie "www.google.com" oder " http://www.google.com ".

Das Ausführen Ihres Textes über Html.fromHtml () sollte den Trick tun. Sie müssen es programmatisch tun, aber es funktioniert.

Jeremy Logan
quelle
2
Die Links in der Textansicht haben eine andere Farbe als andere Texte in der Zeichenfolge, daher denke ich, dass sie als Links erkannt werden. Sie sind einfach nicht anklickbar :-(
Richard
4

Ich weiß nicht, ob es sich lohnt, eine weitere Antwort hinzuzufügen, aber nur für den Fall ...

Ich musste dies an einigen Stellen suchen, bekam aber endlich diese Version des Codes zum Laufen.

string.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 (in 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());

Dies erzeugt zwei anklickbare Hyperlinks mit dem Text link text1und link text2dem umleiten der Benutzer googeln.

Entmagnetisierer
quelle
4

Autolink-Telefon funktioniert bei mir nicht. Das Folgende wirkte wie ein Zauber,

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());
user1995307
quelle
4

Wenn Sie XML-basiertes TextView verwenden, müssen Sie für Ihre Anforderung nur zwei Dinge tun:

  1. Identifizieren Sie Ihren Link in der Zeichenfolge, z. B. "Dies ist meine Webseite". Sie können es in XML oder im Code hinzufügen.

  2. Fügen Sie in der XML-Datei mit der Textansicht Folgendes hinzu:


android:linksClickable="true"

android:autoLink="web"
codeFood
quelle
4

Fügen Sie Ihrer Zeichenfolgenressource CDATA hinzu

Strings.xml

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

Ich benutze den Autolink, um den Text "automatisch zu unterstreichen", habe aber gerade einen "onClick" gemacht, der ihn verwaltet. (Ich bin selbst auf dieses Problem gestoßen)

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

Erfordert keine Berechtigungen, da Sie die Absicht an Apps weitergeben, die diese Ressourcen verwalten (IE-Browser).

Das hat bei mir funktioniert. Viel Glück.

onaclov2000
quelle
Sie machen keinen Link, der anklickbar ist, Sie setzen nur die gesamte Textansicht anklickbar ... Das ist nicht die Frage.
Clauziere
Einverstanden, aber manchmal ist eine Problemumgehung, die funktioniert, dasselbe. Offensichtlich war dies 5 Jahre nachdem die beliebteste Antwort geschrieben wurde, immer noch ein Problem, und es war 6 Monate her, seit ich das gleiche Problem hatte, aber am Ende eine andere, aber funktionierende Lösung gefunden hatte.
Onaclov2000
2

Nur so viel Zeit verschwendet, um herauszufinden, dass Sie getText (R.string.whatever) anstelle von getString (R.string.whatever) verwenden müssen ...

Wie auch immer, hier ist, wie ich meine zum Arbeiten gebracht habe. Mit mehreren Hyperlinks in derselben Textansicht.

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

Zeichenfolgenbeispiel

    <string name="stripe_connected_account_agreement"><a href="https://stripe.com/connect/account-terms">Stripe Connected Account Agreement</a></string>
luca992
quelle
Dies ist so viel einfacher und einfacher zu bedienen. Aus diesem Grund habe ich mehrere Links mit benutzerdefiniertem Text, die in einer dynamisch hinzugefügten Textansicht funktionieren. Dies erfordert die bestmöglichen Upvotes. Ich habe mir den Kopf über Spanned Strings, benutzerdefinierte TextViews und HtmlCompat.fromHtml-Methoden gebrochen. Vielen Dank @ luca992.
Parth Patel