Frage Wie mache ich Links in einem TextView anklickbar?


Ich habe folgendes TextView 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>

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

Android hebt die Links in TextView hervor, aber sie reagieren nicht auf Klicks. Kann mir jemand sagen, was ich falsch mache? Muss ich einen onClickListener für die TextView in meiner Aktivität für etwas so einfach wie diese setzen?

Sieht so aus, als ob es mit der Definition meiner String-Ressource zusammenhängt. 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>

Was schade ist, weil ich lieber einen Textlink zeigen würde, als die vollständige URL anzuzeigen.


819
2018-04-29 01:41


Ursprung


Antworten:


Begraben in den API-Demos 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 meinem TextView entfernt, um mit denen in der Demo übereinzustimmen.

<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 schwierig aufzudecken und zu reparieren.

Wichtig: Vergiss nicht zu entfernen autoLink="web" wenn du anrufst setMovementMethod().


1088
2018-04-30 18:18



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

Eine Sache, die ich erraten könnte, ist, dass eine andere Ansicht über dem Link ist. Etwas, das transparent ist, füllt das gesamte Elternteil, zeigt aber nichts über dem Link an. In diesem Fall wird der Klick auf diese Ansicht statt auf den Link ausgeführt.


459
2018-04-29 07:13



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

  • android:autoLink="web" funktioniert, wenn Sie vollständige Links in Ihrem HTML haben. Das Folgende wird blau und anklickbar hervorgehoben:
  • 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 den folgenden (wird markiert 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, aber die Beschreibung des Links (der Teil zwischen den Tags) selbst ist kein Link. android:autoLink="web" tut NICHT mit solchen Links arbeiten.

  • android:autoLink="web" Wenn in XML festgelegt, wird überschrieben view.setMovementMethod(LinkMovementMethod.getInstance()); (d. h. Links der dritten Art werden hervorgehoben, aber nicht anklickbar).

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


294
2017-12-17 23:45



Die obigen Lösungen haben nicht für mich funktioniert, aber das folgende hat (und es scheint ein bisschen sauberer).
Definieren Sie zuerst in der Zeichenfolgenressource Ihre Tag-öffnenden Chevrons mit der HTML-Entitätscodierung, z.

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

und nicht:

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

Im Allgemeinen codieren Sie alle Chevrons in der Zeichenfolge so. Übrigens muss der Link mit beginnen http://

Dann (wie vorgeschlagen Hier) setze diese Option in deinem TextView:

 android:linksClickable="true"

Im Code schließlich:

((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 ist es, keine Regexes oder andere manuelle Hacks erforderlich.


84
2018-04-12 13:58



Wenn Sie HTML-ähnliche Links hinzufügen möchten, müssen Sie nur Folgendes tun:

  • Fügen Sie eine Ressource HTML-ähnliche Zeichenfolge hinzu:

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

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

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

Das ist es! Und ja, Optionen wie "autoLink" und "linksClickable" funktionieren nur auf expliziten Links (nicht in html-Tags verpackt) ist für mich auch sehr irreführend ...


56
2018-06-29 10:10



Ich habe das einfach benutzt

Linkify.addLinks(TextView, Linkify.ALL);

macht die Links anklickbar gegeben Hier


56
2018-03-26 13:00



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

layout.xml Probe

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

41
2018-06-18 06:14



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

23
2018-05-08 11:00



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

22
2018-04-25 03:20



Richard, nächstes Mal solltest du diesen Code unter TextView im XML-Layout einfü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());) um den Link klickbar zu machen.

Auch hier ist die Wahrheit: Solange Sie die AutoLink und das LinksklickbarVergessen Sie nicht, dies anzufügen String.xml Datei, damit der anklickbare Link funktioniert.

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

18
2017-07-29 14:05