Ich habe eine TextView, die einfaches HTML rendert und 2+ Links enthält. Ich muss Klicks auf die Links erfassen und die Links öffnen - in meinem eigenen internen WebView (nicht im Standardbrowser).
Die gebräuchlichste Methode zum Rendern von Links scheint folgende zu sein:
String str_links = "<a href='http://google.com'>Google</a><br /><a href='http://facebook.com'>Facebook</a>";
text_view.setLinksClickable(true);
text_view.setMovementMethod(LinkMovementMethod.getInstance());
text_view.setText( Html.fromHtml( str_links ) );
Dies führt jedoch dazu, dass die Links im internen Standard-Webbrowser geöffnet werden (wobei das Dialogfeld "Aktion mit ... abschließen" angezeigt wird).
Ich habe versucht, einen onClickListener zu implementieren, der beim Klicken auf den Link ordnungsgemäß ausgelöst wird, aber ich weiß nicht, wie ich feststellen kann, auf welchen Link geklickt wurde ...
text_view.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// what now...?
}
});
Alternativ habe ich versucht, eine benutzerdefinierte LinkMovementMethod-Klasse zu erstellen und onTouchEvent zu implementieren ...
public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
String url = text.toString();
// this doesn't work because the text is not necessarily a URL, or even a single link...
// eg, I don't know how to extract the clicked link from the greater paragraph of text
return false;
}
Ideen?
Beispiellösung
Ich habe eine Lösung gefunden, die die Links aus einer HTML-Zeichenfolge analysiert und anklickbar macht und Sie dann auf die URL antworten lässt.
span.getURL()
".) Du könntest es sogar als Antwort posten, da es besser ist als die derzeit akzeptierte Antwort!Antworten:
Basierend auf einer anderen Antwort ist hier eine Funktion setTextViewHTML (), die die Links aus einer HTML-Zeichenfolge analysiert und anklickbar macht und Sie dann auf die URL antworten lässt.
quelle
ListView
s, wenn aView
'sfocusable
auf true gesetzt ist. Dies geschieht normalerweise mitButton
s /ImageButton
s. RufensetFocusable(false)
Sie anTextView
.text.setMovementMethod(LinkMovementMethod.getInstance());
Stellen Sie sicher, dass Sie URLSpanSie haben Folgendes getan:
Haben Sie es in umgekehrter Reihenfolge versucht, wie unten gezeigt?
und ohne:
quelle
Dies kann einfach mithilfe von Spannable String gelöst werden. Was Sie wirklich tun möchten (Geschäftsanforderung), ist mir ein wenig unklar, sodass der folgende Code keine genaue Antwort auf Ihre Situation gibt, aber ich bin mir ziemlich sicher, dass er Ihnen eine Idee gibt und Sie können Ihr Problem anhand des folgenden Codes lösen.
Während Sie dies tun, erhalte ich auch einige Daten über eine HTTP-Antwort und ich habe in meinem Fall "mehr" zusätzlichen unterstrichenen Text hinzugefügt. Dieser unterstrichene Text öffnet den Webbrowser beim Klickereignis. Hoffentlich hilft Ihnen dies.
quelle
Ich hatte das gleiche Problem, aber viel Text gemischt mit wenigen Links und E-Mails. Ich denke, die Verwendung von 'autoLink' ist eine einfachere und sauberere Möglichkeit:
Sie können Linkify.EMAIL_ADDRESSES oder Linkify.WEB_URLS festlegen, wenn Sie nur eine davon verwenden oder im XML-Layout festlegen möchten
Die verfügbaren Optionen sind: keine, Web, E-Mail, Telefon, Karte, alle
quelle
Lösung
Ich habe eine kleine Klasse implementiert, mit deren Hilfe Sie lange Klicks auf TextView selbst und Tippen auf die Links in TextView verarbeiten können.
Layout
TextViewClickMovement.java
Verwendung
Links
Hoffe das hilft! Code finden Sie hier .
quelle
text_view.setMovementMethod(new TextViewClickMovement(this, context));
. Android Studio beschwert sich, dasscontext
nicht gelöst werden konnte.Eine sauberere und bessere Lösung mit der Linkify-Bibliothek von native .
Beispiel:
quelle
Ich habe in Kotlin eine einfache Erweiterungsfunktion erstellt, mit der URL-Link-Klicks in einer Textansicht abgefangen werden können, indem ein neuer Rückruf auf URLSpan-Elemente angewendet wird.
string.xml (Beispiellink im Text)
Stellen Sie sicher, dass Ihr übergreifender Text auf TextView eingestellt ist, bevor Sie "handleUrlClicks" aufrufen.
Dies ist die Erweiterungsfunktion:
So nenne ich es:
quelle
Wenn Sie Kotlin verwenden, habe ich eine einfache Erweiterung für diesen Fall geschrieben:
Verwendung:
quelle
Ein alternativer, imho viel einfacherer Ansatz (für faule Entwickler wie mich;)
Bei Bedarf können Sie auch nach Schema / Mimetyp der Absicht suchen
quelle
Ich benutze nur textView und setze die Spanne für URL und Handle Click.
Ich habe hier eine sehr elegante Lösung gefunden, ohne zu verknüpfen - demnach weiß ich, welchen Teil der Zeichenfolge ich verknüpfen möchte
Text Textlink Link klicken in meiner Android App
in Kotlin:
und Verwendung: linkify (yourTextView, urlString, context)
quelle