Cómo hacer clic o tocar un texto de TextView

Sé que esto es muy fácil (doh …) pero estoy buscando una forma de ejecutar un método para tocar o hacer clic en una línea de texto de TextView en una aplicación de Android.

Sigo pensando en oyentes de botones y llamadas a escuchas de métodos anónimos, pero simplemente no parece aplicarse a TextView.

¿Puede alguien señalarme un fragmento de código para mostrar cómo se ejecuta un método al hacer clic o tocar una parte del texto en un TextView?

Puede configurar el manejador de clics en xml con estos atributos:

android:onClick="onClick" android:clickable="true" 

No olvides el atributo que se puede hacer clic, sin él no se llama al controlador de clics.

main.xml

  ...  ... 

MyActivity.java

  public class MyActivity extends Activity { public void onClick(View v) { ... } } 

Puede que no sea exactamente lo que estás buscando, pero esto es lo que funcionó para lo que estoy haciendo. Todo esto es después de mi onCreate :

 boilingpointK = (TextView) findViewById(R.id.boilingpointK); boilingpointK.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if ("Boiling Point K".equals(boilingpointK.getText().toString())) boilingpointK.setText("2792"); else if ("2792".equals(boilingpointK.getText().toString())) boilingpointK.setText("Boiling Point K"); } }); 

OK He respondido mi propia pregunta (¿pero es la mejor manera?)

Esta es la forma de ejecutar un método cuando haces clic o tocas un texto en un TextView:

 package com.textviewy; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; public class TextyView extends Activity implements OnClickListener { TextView t ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); t = (TextView)findViewById(R.id.TextView01); t.setOnClickListener(this); } public void onClick(View arg0) { t.setText("My text on click"); } } 

y mi main.xml es:

 < ?xml version="1.0" encoding="utf-8"?>        

desde dentro de una actividad que llama un diseño y una vista de texto, este oyente de clic funciona:

 setContentView(R.layout.your_layout); TextView tvGmail = (TextView) findViewById(R.id.tvGmail); String TAG = "yourLogCatTag"; tvGmail.setOnClickListener(new OnClickListener() { @Override public void onClick(View viewIn) { try { Log.d(TAG,"GMAIL account selected"); } catch (Exception except) { Log.e(TAG,"Ooops GMAIL account selection problem "+except.getMessage()); } } }); 

la vista de texto se declara así (asistente predeterminado):

   

y en el archivo strings.xml

 Google ID (Gmail) 

en textView

  

También debe implementar View.OnClickListener y en el método On Click puede usar intenciones

  Intent intent = new Intent(android.content.Intent.ACTION_VIEW); intent.setData(Uri.parse("https://youraddress.com")); startActivity(intent); 

Probé que esta solución funciona bien.

Aunque puede resolver el problema configurando el oyente en la vista de texto, se recomienda no hacerlo. Debes usar el botón plano ya que es una subclase de Botón y proporciona muchos atributos que TextView no ofrece.


Para usar el botón plano, agrega el atributo style="?android:attr/borderlessButtonStyle"

  

Para hacer clic en una parte del texto (no en todo TextView ), puede usar Html o Linkify (ambos crean enlaces que abren urls, sin embargo, no una callback en la aplicación).

Linkify

Use un recurso de cadena como:

 Here is a link: http://www.stackoverflow.com 

Luego en una vista de texto:

 TextView textView = ... textView.setText(R.string.links); Linkify.addLinks(textView, Linkify.ALL); 

Html

Usando Html.fromHtml :

 Here you can put html <a href="http://www.stackoverflow.com">Link!</> 

Luego en tu vista de texto:

 textView.setText(Html.fromHtml(getString(R.string.html))); 

Puede usar TextWatcher para TextView, es más flexible que ClickLinstener (no mejor ni peor, solo más de una forma).

 holder.bt_foo_ex.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // code during! } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // code before! } @Override public void afterTextChanged(Editable s) { // code after! } });