studio - open url textview android
¿Cómo hago enlaces en un TextView clicable? (30)
Agregue CDATA a su recurso de cadena
Strings.xml
<string name="txtCredits"><![CDATA[<a href=/"http://www.google.com/">Google</a>]]></string>
Tengo el siguiente TextView definido:
<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
es un recurso de cadena que contiene <a href="some site">Link text</a>
.
Android está resaltando los enlaces en TextView, pero no responden a los clics. ¿Puede alguien decirme lo que estoy haciendo mal? ¿Tengo que configurar un onClickListener para TextView en mi actividad para algo tan simple como esto?
Parece que tiene que ver con la forma en que defino mi recurso de cadena. Esto no funciona:
<string name="txtCredits"><a href="http://www.google.com">Google</a></string>
Pero esto hace:
<string name="txtCredits">www.google.com</string>
Lo que es un rollo porque preferiría mostrar un enlace de texto en lugar de mostrar la URL completa.
Aquí hay un código de Android de una sola línea para hacer que el teléfono y la URL se puedan seleccionar desde textView sin importar qué cadena y qué datos. No necesitas usar ninguna etiqueta HTML para esto.
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);
Así es como resolví los enlaces visibles y visibles en un TextView (por código)
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>"));
}
Asegúrese de no usar setAutoLinkMask(Linkify.ALL)
cuando use setMovementMethod(LinkMovementMethod.getInstance())
y Html.fromHTML()
en enlaces HTML
formato Html.fromHTML()
(por ejemplo, <a href="http://www.google.com/">Google</a>
).
Después de pasar un tiempo con esto, he encontrado que:
-
android:autoLink="web"
funciona si tiene enlaces completos en su HTML. Lo siguiente se resaltará en azul y se puede hacer clic:
- Un texto
<a href="http://www.google.com">http://www.google.com</a>
- Un poco de texto
http://www.google.com
-
view.setMovementMethod(LinkMovementMethod.getInstance());
Trabajará con lo siguiente (se resaltará y se podrá hacer clic):
- Un texto
<a href="http://www.google.com">http://www.google.com</a>
- Un poco de texto
http://www.google.com
- Algunos textos
<a href="http://www.google.com">Go to Google</a>
Tenga en cuenta que la tercera opción tiene un hipervínculo, pero la descripción del enlace (la parte entre las etiquetas) en sí no es un enlace. android:autoLink="web"
NO funciona con dichos enlaces.
-
android:autoLink="web"
si se establece en XML anularáview.setMovementMethod(LinkMovementMethod.getInstance());
(es decir, los enlaces del tercer tipo se resaltarán, pero no se podrán hacer clic).
La moraleja de la historia es use view.setMovementMethod(LinkMovementMethod.getInstance());
en su código y asegúrese de no tener android:autoLink="web"
en su diseño XML si desea que se pueda hacer clic en todos los enlaces.
El enlace automático no funcionó para mí. Lo siguiente funcionó a la perfección,
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());
Enterrado en las demostraciones de API, encontré la solución a mi problema:
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());
Eliminé la mayoría de los atributos en mi TextView para coincidir con lo que había en la demostración.
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/txtCredits"/>
Eso lo resolvió. Bastante difícil de descubrir y arreglar.
Importante : No olvide eliminar autoLink="web"
si está llamando a setMovementMethod()
.
Estoy usando solo android:autoLink="web"
y funciona bien. Un clic en el enlace abre el navegador y muestra la página correcta.
Una cosa que puedo adivinar es que alguna otra vista está por encima del enlace. Algo que es transparente llena a todo el padre pero no muestra nada sobre el enlace. En este caso, el clic va a esta vista en lugar del enlace.
La razón por la que tiene el problema es que solo intenta coincidir con las direcciones "desnudas". cosas como "www.google.com" o " http://www.google.com ".
Ejecutar su texto a través de Html.fromHtml() debería hacer el truco. Tienes que hacerlo programáticamente, pero funciona.
La respuesta aceptada es correcta, PERO significará que los números de teléfono, los mapas, las direcciones de correo electrónico y los enlaces regulares, por ejemplo, http://google.com
sin etiquetas href, ya NO podrán hacer clic, ya que no puede tener el enlace automático en el xml.
La única solución completa para hacer TODO TODO lo que he encontrado es la siguiente:
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());
Y el TextView NO debería tener android:autolink
. No hay necesidad de android:linksClickable="true"
tampoco; es verdad por defecto
Las soluciones anteriores no funcionaron para mí, pero lo siguiente sí (y parece un poco más limpio).
Primero, en el recurso de cadena, defina sus chevrones de apertura de etiquetas usando la codificación de entidad HTML, es decir:
<a href="http://www.google.com">Google</a>
y no:
<a href="http://www.google.com">Google</a>
En general, codifica todos los chevrones en la cadena de esa manera. Por cierto, el enlace debe comenzar con http://
Luego (como se sugiere here ) establezca esta opción en su TextView:
android:linksClickable="true"
Finalmente, en código, hacer:
((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)));
Eso es todo, no se requieren expresiones regulares ni otros trucos manuales.
Lo más fácil que me funcionó es usar here
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);
y detectará automáticamente las direcciones URL del texto en la vista de texto.
Lo siguiente debería funcionar para cualquier persona que busque una combinación de texto e hipervínculo dentro de una aplicación de Android.
En 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>
Ahora puedes utilizar esta string
en cualquier View
dada como esta:
<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"/>
Ahora, en tu Actividad o Fragmento, haz lo siguiente:
TextView getapp =(TextView) findViewById(R.id.getapp);
getapp.setMovementMethod(LinkMovementMethod.getInstance());
Por ahora, no es necesario configurar android:autoLink="web"
o android:linksClickable="true"
usando este enfoque.
Espero que encuentres esto útil.
Mi código era así:
<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"/>
Mi código de Java era así:
/*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));
}
});
Esto solo apunta el enlace a otra actividad. Pero ese enlace se puede hacer clic y funciona sin problemas. Probado en Android Studio 1.5 (Vista previa)
No sé si vale la pena agregar otra respuesta, pero por si acaso ...
Tuve que buscarlo en un par de lugares, pero finalmente conseguí que funcionara esta versión del código.
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 (en 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());
Esto creará dos hipervínculos seleccionables con el texto link text2
y el link text2
que redirigen al usuario a Google.
Noté que usando android:autoLink="web"
tanto
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"/>
funcionó bien para las URL, pero como tenía una dirección de correo electrónico y un número de teléfono que también quería vincular, terminé usando esta línea de android:autoLink="all"
como esto
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="all"/>
Y funcionó como un encanto.
Richard, la próxima vez, debe agregar este código en TextView en el diseño XML en su lugar.
android:autoLink="all"
Esto debería ser así.
<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>
No es necesario usar este código ( t2.setMovementMethod(LinkMovementMethod.getInstance());
) para poder hacer clic en el enlace.
Además, aquí está la verdad: siempre que configure el enlace automático y los enlaces en los que se puede hacer clic , no olvide agregar esto en el archivo String.xml para que funcione el enlace en el que se puede hacer clic.
<string name="txtCredits"><a href="http://www.google.com">Google</a></string>
Sólo necesitas esto:
android:autoLink="web"
Inserte esta línea en TextView, que se puede hacer clic con referencia a la web. Dirección URL configurada como texto de este TextView.
Ejemplo:
<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" />
Si desea agregar un enlace similar a HTML, todo lo que necesita hacer es:
agregar una cadena similar a HTML de recursos:
<string name="link"><a href="https://www.google.pl/">Google</a></string>
agregue su vista al diseño sin ninguna configuración específica de enlace:
<TextView android:id="@+id/link" android:text="@string/link" />`
agregue el método de movimiento apropiado programáticamente a su TextView:
mLink = (TextView) findViewById(R.id.link); if (mLink != null) { mLink.setMovementMethod(LinkMovementMethod.getInstance()); }
¡Eso es! Y sí, tener opciones como "autoLink" y "linksClickable" trabajando solo en enlaces explícitos (no envueltos en etiquetas html) también es muy engañoso para mí ...
Si usa TextView basado en XML, para su requerimiento necesita hacer solo dos cosas:
Identifique su enlace en la cadena, como "esta es mi página web". Puedes añadirlo en xml o en el código.
En el xml que tiene el TextView, agregue estos:
android:linksClickable="true"
android:autoLink="web"
Solo lo que necesitas para agregar esto en la vista de texto en xml
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"/>
Solo perdí tanto tiempo para descubrir que tienes que usar getText (R.string.whatever) en lugar de getString (R.string.whatever) ...
De todos modos, aquí es cómo conseguí el mío trabajando. Con múltiples hipervínculos en la misma vista de texto también.
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"/>
ejemplo de cadena
<string name="stripe_connected_account_agreement"><a href="https://stripe.com/connect/account-terms">Stripe Connected Account Agreement</a></string>
Use el siguiente código:
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));
Utilizar esta...
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);
}
});
y agregar permiso en el archivo de manifiesto
<uses-permission android:name="android.permission.INTERNET"/>
Utilizo el enlace automático para "subrayar automáticamente" el texto, pero solo hice un "onClick" que lo maneja. (Me encontré con este problema a mí mismo)
<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
{
}
}
No requiere ningún permiso, ya que está transfiriendo la intención a las aplicaciones que administran esos recursos, (navegador IE).
Esto fue lo que funcionó para mí. Buena suerte.
TextView
esta línea a TextView
: android:autoLink="web"
A continuación se muestra un ejemplo de uso en un archivo de diseño.
muestra layout.xml
<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>
[Tested in Pre-lollipop as well as in Lollipop and above]
Puede obtener su cadena HTML desde el backend o desde sus archivos de recursos. Si coloca el texto como una cadena de recursos, asegúrese de agregar la etiqueta CDATA
:
<string name="your_text">![CDATA[...<a href="your_link">Link Title</a> ...]]</string>
Luego, en el código necesita obtener la cadena y asignarla como HTML y establecer un método de movimiento de enlace:
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.
}
Espero que esto ayude;
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());
utilizando linkify : Linkify toma un fragmento de texto y una expresión regular y convierte todas las coincidencias de expresiones regulares en el texto en enlaces seleccionables
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("http://www.domain.com");
Linkify.addLinks(textView, Linkify.WEB_URLS);
No te olvides de
import android.widget.TextView;