Ich rendere derzeit HTML-Eingaben in einer Textansicht wie folgt:
tv.setText(Html.fromHtml("<a href='test'>test</a>"));
Der angezeigte HTML-Code wird mir über eine externe Ressource zur Verfügung gestellt, sodass ich die Dinge nicht wie gewünscht ändern kann, aber ich kann natürlich einige Regex-Manipulationen am HTML-Code vornehmen, um beispielsweise den href-Wert in etwas anderes zu ändern.
Ich möchte in der Lage sein, einen Link-Klick direkt aus der App heraus zu verarbeiten, anstatt den Link ein Browserfenster öffnen zu lassen. Ist das überhaupt erreichbar? Ich vermute, es wäre möglich, das Protokoll des href-Werts auf "myApp: //" zu setzen und dann etwas zu registrieren, mit dem meine App dieses Protokoll verarbeiten kann. Wenn dies in der Tat der beste Weg ist, würde ich gerne wissen, wie das gemacht wird, aber ich hoffe, es gibt einen einfacheren Weg, einfach zu sagen: "Wenn in dieser Textansicht auf einen Link geklickt wird, möchte ich ein Ereignis auslösen, das empfangen wird der href-Wert des Links als Eingabeparameter "
Antworten:
Fast ein Jahr später habe ich mein spezielles Problem auf andere Weise gelöst. Da ich wollte, dass der Link von meiner eigenen App verwaltet wird, gibt es eine Lösung, die etwas einfacher ist.
Neben dem Standard-Absichtsfilter lasse ich meine
ACTION_VIEW
Zielaktivität einfach die Absichten abhören , insbesondere die mit dem Schemacom.package.name
Dies bedeutet, dass Links, die mit beginnen
com.package.name://
, von meiner Aktivität behandelt werden.Ich muss also nur eine URL erstellen, die die Informationen enthält, die ich übermitteln möchte:
In meiner Zielaktivität kann ich diese Adresse abrufen:
In meinem Beispiel könnte ich einfach
data
nach Nullwerten suchen, denn wenn es nicht Null ist, weiß ich, dass es über einen solchen Link aufgerufen wurde. Von dort extrahiere ich die Anweisungen, die ich benötige, aus der URL, um die entsprechenden Daten anzeigen zu können.quelle
getData
gibt Ihnen den vollständigen URI, den Sie auch verwenden könnengetDataString
, um eine Textdarstellung zu erhalten. In beiden Fällen können Sie die URL so erstellen, dass sie alle benötigten Daten enthältcom.package.name://my-action/1/2/3/4
, und Sie können die Informationen aus dieser Zeichenfolge extrahieren.Uri data = getIntent().getData();
? Ich erhalte immer wiederActivity not found to handle intent
Fehler. - DankeEine andere Möglichkeit ist das Ausleihen von Linkify, aber Sie können Ihre Handhabung anpassen.
Benutzerdefinierte Spannenklasse:
Hilfsfunktion:
Verwendung:
quelle
wenn die Textansicht mehrere Links enthält. Zum Beispiel hat die Textansicht "https: //" und "tel no". Wir können die LinkMovement-Methode anpassen und Klicks für Wörter basierend auf einem Muster verarbeiten. Anbei die angepasste Link-Bewegungsmethode.
Dies sollte in der Textansicht folgendermaßen aufgerufen werden:
quelle
widget.getContext()
stattdessen einfach .Hier ist eine allgemeinere Lösung, die auf der Antwort von @Arun basiert
Um es einfach zu verwenden , implementieren
onLinkClick
derTextViewLinkHandler
Klasse. Zum Beispiel:quelle
Es ist sehr einfach, diese Zeile zu Ihrem Code hinzuzufügen:
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
Nur um eine alternative Lösung mit einer von mir erstellten Bibliothek zu teilen. Mit Textoo kann dies wie folgt erreicht werden:
Oder mit dynamischer HTML-Quelle:
quelle
denn wer hier nach mehr Möglichkeiten sucht, ist einer
RESSOURCE: CodePath
quelle
quelle
Ich habe die Farbe der Textansicht in Blau geändert, indem ich zum Beispiel Folgendes verwendet habe:
in der XML-Datei. Wie es unterstrichen wird, wird hier erklärt .
Verwenden Sie dann die onClick-Eigenschaft, um eine Methode anzugeben (ich vermute, Sie könnten sie
setOnClickListener(this)
auch auf andere Weise aufrufen ), z.Auf diese Weise kann ich wie gewohnt tun, was ich will, z. B. eine Absicht starten. Beachten Sie, dass Sie immer noch das Normale
myTextView.setMovementMethod(LinkMovementMethod.getInstance());
tun müssen, wie in der onCreate () -Methode Ihrer Aktivität.quelle
Diese Antwort erweitert die hervorragende Lösung von Jonathan S:
Mit der folgenden Methode können Sie Links aus dem Text extrahieren:
Dies kann verwendet werden, um einen der Parameter in der
clickify()
Methode zu entfernen :Einige Änderungen am ClickSpan:
Jetzt können Sie einfach den Text in der Textansicht festlegen und einen Listener hinzufügen:
quelle
Die beste Art, die ich benutzt habe und es hat immer bei mir funktioniert
quelle
Beispiel: Angenommen, Sie haben Text in der Textansicht festgelegt und möchten einen Link zu einem bestimmten Textausdruck bereitstellen: "Klicken Sie auf #facebook , um zu facebook.com zu gelangen."
Im Layout xml:
In Aktivität:
Erstellen Sie außerdem einen Tag-Anbieter als:
In der Manifestdatei als Eintrag für Anbieter- und Testaktivität wie folgt eingeben:
Wenn Sie nun auf #facebook klicken, wird testactivtiy aufgerufen. In der Testaktivität können Sie die Daten wie folgt abrufen:
quelle