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.
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.
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.
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.
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 .:
<a href="http://www.google.com">Google</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.
ich habe das einfach benutzt
Linkify.addLinks(TextView, Linkify.ALL);
macht die Links anklickbar hier
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 ...
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>
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());
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"/>
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>
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.
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.
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;
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);
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.
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>
).
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" />
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.
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"/>
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>"));
}
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));
[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.
}
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.
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());
Fügen Sie Ihrer Zeichenfolgenressource CDATA hinzu
Strings.xml
<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>
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.
Wenn Sie XML-basiertes TextView verwenden, müssen Sie für Ihre Anforderung nur zwei Dinge tun:
Identifizieren Sie Ihren Link in der Zeichenfolge, z. B. "Dies ist meine Webseite". Sie können es in XML oder im Code hinzufügen.
Fügen Sie in der XML mit der TextView Folgendes hinzu:
Android:linksClickable="true"
Android:autoLink="web"
Verwalten der Linkify-Textfarbe Auch
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 );
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"><a href="http://www.google.com">link text1</a></string>
<string name="name2"><a href="http://www.google.com">link text2</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.
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!
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)
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>
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.