1159 Stimmen

Wie man Links in einer TextView anklickbar macht

Ich habe die folgende 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>

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

Android hebt die Links in der TextView hervor, aber sie reagieren nicht auf Klicks. Was mache ich falsch? Muss ich einen onClickListener für die TextView in meiner Aktivität für etwas so Einfaches wie dies festlegen?

Es sieht so aus, als ob es mit der Art und Weise zu tun hat, wie ich meine String-Ressource definiere.

Das funktioniert nicht:

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

Aber das hier schon:

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

Das ist schade, denn ich würde viel lieber einen Textlink anzeigen als die vollständige URL.

6voto

farhanjk Punkte 1384

Erstellen Sie eine Erweiterungsmethode für SpannableString:

private fun SpannableString.setLinkSpan(text: String, url: String) {
    val textIndex = this.indexOf(text)
    setSpan(
        object : ClickableSpan() {
            override fun onClick(widget: View) {
                Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url) }.also { startActivity(it) }
            }
        },
        textIndex,
        textIndex + text.length,
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
    )
}

Benutzen Sie es, um eine Zeichenkette in Ihrer TextView klickbar zu machen:

    myTextView.apply {
        movementMethod = LinkMovementMethod.getInstance()

        val googleUrl = "http://www.google.com"
        val microsoftUrl = "http://www.microsoft.com"

        val google = "Google"
        val microsoft = "Microsoft"

        val message = SpannableString("$google & $microsoft").apply {
            setLinkSpan(google, googleUrl)
            setLinkSpan(microsoft, microsoftUrl)
        }

        text = message
    }

Viel Spaß!

enter image description here

6voto

degausser Punkte 177

Ich musste das an einigen Stellen suchen, aber schließlich habe ich diese Version des Codes zum Laufen gebracht.

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

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

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

Dadurch werden zwei anklickbare Hyperlinks mit dem Text link text1 y link text2 die den Nutzer zu Google weiterleiten.

5voto

luca992 Punkte 1483

Ich habe gerade so viel Zeit verschwendet, um herauszufinden, dass man getText(R.string.whatever) anstelle von getString(R.string.whatever) verwenden muss...

Wie auch immer, so habe ich mein Gerät zum Laufen gebracht. Auch mit mehreren Hyperlinks in der gleichen 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"/>

Beispiel für einen String:

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

5voto

Akexorcist Punkte 2187

CDATA zu Ihrer String-Ressource hinzufügen

Zeichenketten.xml

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

5voto

codeFood Punkte 1231

Wenn Sie eine XML-basierte TextView verwenden, müssen Sie für Ihre Anforderungen nur zwei Dinge tun:

  1. Geben Sie Ihren Link in der Zeichenfolge an, z. B. "Dies ist meine WebPage". Sie können ihn in den XML-Inhalt oder in den Code einfügen.

  2. Fügen Sie dem XML-Inhalt, der die TextView enthält, Folgendes hinzu:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X