wake-up-neo.com

Wie mache ich Links in einer 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>

dabei ist @string/txtCredits eine Zeichenfolgenressource, die <a href="some site">Link text</a> enthält.

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

Sieht so aus, als hätte das damit zu tun, wie ich meine Zeichenfolgenressource definiere. Das funktioniert nicht:

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

Aber das macht:

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

Das ist ein Mist, weil ich lieber einen Textlink als die vollständige URL anzeigen möchte.

940
Richard

Eingebettet in die API-Demos habe ich die Lösung für mein Problem gefunden:

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 TextView entfernt, damit sie mit denen in der Demo übereinstimmen.

<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, autoLink="web" zu entfernen, wenn Sie setMovementMethod() aufrufen.

1180
Richard

Ich verwende 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 sich eine andere Ansicht über dem Link befindet. Etwas Transparentes 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.

502
Janusz

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

  • Android:autoLink="web" funktioniert, wenn Ihr HTML-Code vollständige Links enthält. Folgendes wird blau hervorgehoben und kann angeklickt werden:
  • Ein Text <a href="http://www.google.com">http://www.google.com</a>
  • Ein Text http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance()); funktioniert mit folgenden Funktionen (wird hervorgehoben und kann angeklickt werden):
  • Ein Text <a href="http://www.google.com">http://www.google.com</a>
  • Ein Text http://www.google.com
  • Ein 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, überschreibt view.setMovementMethod(LinkMovementMethod.getInstance()); (d. H. Links der dritten Art werden hervorgehoben, sind jedoch nicht anklickbar).

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

341
Jeshurun

Die obigen 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 des Tags mithilfe der HTML-Entitätscodierung, d. H .:

&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 http:// beginnen

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

 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.

92
Blazej Czapp

ich habe das einfach benutzt

Linkify.addLinks(TextView, Linkify.ALL);

macht die Links anklickbar hier

63
jai_b

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

  • fügen Sie eine HTML-ähnliche Zeichenfolge für die Ressource hinzu:

     <string name="link"><a href="https://www.google.pl/">Google</a></string>
    
  • fügen Sie dem Layout Ihre Ansicht hinzu, ohne dass eine verknüpfungsspezifische Konfiguration erforderlich ist:

     <TextView
        Android:id="@+id/link"
        Android:text="@string/link" />`
    
  • fügen Sie Ihrem 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" nur für explizite Links (nicht in HTML-Tags eingebunden) zu haben, ist für mich ebenfalls sehr irreführend ...

60
vizZ

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

layout.xml Beispiel

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

Ich hoffe das 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());
25
Bebin T.N

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"/>
24
Ahmed Mostafa

Richard, das nächste Mal sollten Sie diesen Code stattdessen unter TextView in der 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 (t2.setMovementMethod(LinkMovementMethod.getInstance());) nicht verwenden, um den Link anklickbar zu machen.

Auch hier ist die Wahrheit: Solange Sie den autoLink und den linksClickable , vergessen Sie nicht, diese Datei unter String.xml hinzuzufügen, damit der anklickbare Link funktioniert.

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

Das Einfachste, was bei mir funktioniert hat, ist 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.

19
pks

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

In string.xml:

<string name="applink">Looking for the regular Zesteve App? 
<a href="https://play.google.com/store/apps/details?id=zesteve.com.myapplication">Get it here</a>
</string>

Jetzt können Sie dieses string in einem beliebigen View wie folgt verwenden:

<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 die folgenden Schritte aus:

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

Inzwischen müssen Sie mit dieser Methode weder Android:autoLink="web" noch Android:linksClickable="true" einstellen.

Ich hoffe, Sie finden dies hilfreich.

16
Asesha George

mit linkify : Linkify nimm a Stück Text und ein regulärer Ausdruck und verwandelt alle Regex-Übereinstimmungen im Text in anklickbare Links

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

Vergiss das nicht

import Android.widget.TextView;
15
DeathRs

Hier ist nur eine Zeile Android Code, mit dem Telefon und URL aus textView ausgewählt werden können, unabhängig davon, was Zeichenfolge und was Daten sind. Sie müssen dafü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);
14
Rahul Raina

Mir ist aufgefallen, dass ich Android:autoLink="web" so benutze

<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 auch verknüpfen wollte, benutzte ich diese Zeile Android:autoLink="all"

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

und es funktionierte wie ein Zauber.

12
aLearner

Stellen Sie sicher, dass nichtsetAutoLinkMask(Linkify.ALL) verwendet, wenn setMovementMethod(LinkMovementMethod.getInstance()) und Html.fromHTML() für ordnungsgemäß formatierte HTML Links verwendet werden (z. B. <a href="http://www.google.com/">Google</a>).

11
elevenfive

Sie brauchen nur Folgendes:

Android:autoLink="web"

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

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

Die akzeptierte Antwort ist korrekt, ABER dies bedeutet, dass Telefonnummern, Karten, E-Mail-Adressen und reguläre Links, z. http://google.com ohne href-Tags kann NICHT MEHR angeklickt werden, da keine automatische Verknüpfung in der XML-Datei möglich ist.

Die einzige vollständige Lösung, mit der ALLES anklickbar ist, was ich gefunden habe, 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 Textansicht sollte NICHT Android:autolink haben. Es gibt auch keine Notwendigkeit für Android:linksClickable="true"; es ist standardmäßig wahr.

8
Kelly McKinnon

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 der Manifestdatei hinzu

<uses-permission Android:name="Android.permission.INTERNET"/>
8
Tej

So löste ich anklickbare 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>"));
    }
7
Dominic Bartl

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

[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 CDATA -Tag 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 Methode zum Verschieben von Links 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.
}
6
Benny

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

Führen Sie Ihren Text durch Html.fromHtml () sollte den Trick tun. Man muss es programmatisch machen, aber es funktioniert.

5
Jeremy Logan

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

Fügen Sie Ihrer Zeichenfolgenressource CDATA hinzu

Strings.xml

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

Ich benutze den Autolink, um den Text "automatisch zu unterstreichen", habe aber nur ein "onClick" erstellt, das 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 (z. B. Browser).

Das hat bei mir funktioniert. Viel Glück.

3
onaclov2000

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 mit der TextView Folgendes hinzu:


Android:linksClickable="true"

Android:autoLink="web"
3
codeFood

Verwalten der Linkify-Textfarbe Auch enter image description here

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

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

Ich musste das an ein paar Stellen suchen, bekam aber endlich diese Version des Codes zum Laufen.

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 (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 und link text2 erstellt, die den Nutzer zu Google weiterleiten.

3
degausser

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

Verwenden Sie diese Option, um die Zeichenfolge in Ihrer TextView anklickbar 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
    }

Genießen!

enter image description here

2
farhanjk

Mein Code war wie folgt:

<TextView
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:id="@+id/link"
    Android:text="@string/forgot"
    Android:layout_marginTop="16dp"
    Android:gravity="center"
    Android:linksClickable="true"/>

Mein Java Code war wie folgt:

/*TextView action*/
        TextView textView = (TextView) findViewById(R.id.link);
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this,forgot.class));
            }
        });  

Dies zeigt nur den Link zu einer anderen Aktivität. Aber dieser Link ist anklickbar und funktioniert reibungslos. Getestet in Android Studio 1.5 (Vorschau)

1
Ajay Kulkarni

Verschwendete nur so viel Zeit, 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"/>

string-Beispiel

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

Da Datenbindung nicht mehr verfügbar ist, möchte ich meine Lösung für die Datenbindung von TextViews, die HTML-Tags mit anklickbaren Links unterstützen, mit anderen teilen.

Um zu vermeiden, dass jede Textansicht abgerufen und mit From.html in HTML unterstützt wird, erweitern wir die Textansicht und fügen die Logik in setText() ein.

public class HtmlTextView extends TextView {

    public HtmlTextView(Context context) {
        super(context);
    }

    public HtmlTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(Html.fromHtml(text.toString()), type);
        this.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

Ich habe ein Gist erstellt , das auch ein Beispiel für eine Entität und eine Ansicht für deren Verwendung zeigt.

0
Tapirboy