Cómo hacer clic o tocar un texto TextView

199

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

Sigo pensando en oyentes de botones y llamadas de oyentes de métodos anónimos, pero parece que no se aplica a TextView.

¿Alguien puede señalarme un fragmento de código para mostrar cómo hacer clic o tocar un fragmento de texto en un TextView ejecuta un método?

Droide
fuente
64
Realmente deberías aceptar la respuesta más importante.
Marek Sebera
8
Tendría que iniciar sesión para hacer eso.
Carl Anderson el
15
Y también se ha llevado un buen nombre de usuario: /
MeetM
Para el futuro, si alguien está usando Kotlin y quiere tener un control total sobre el texto en el que se puede hacer clic con devolución de llamada, escribí un artículo sobre él para tener una función de extensión para TextView- link.medium.com/TLq6s8ltc3
Hossain Khan

Respuestas:

456

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

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

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

main.xml

    ...

    <TextView 
       android:id="@+id/click"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"               
       android:text="Click Me"
       android:textSize="55sp"
       android:onClick="onClick"                
       android:clickable="true"/>
    ...

MyActivity.java

       public class MyActivity extends Activity {

          public void onClick(View v) {
            ...
          }  
       }
Patrick Cullen
fuente
6060
"No olvide el atributo en el que se puede hacer clic, sin él no se llama al controlador de clics". Esta línea salvó tu día. Muchas gracias amigo.
N-JOY
2
developer.android.com/reference/android/view/… necesita mencionar algo acerca de hacer clic. podría haber ahorrado una hora
Taylor
44
Curiosamente, usar setOnClickListenerestablece el clickableatributo, pero usar el onClickatributo aparentemente no lo hace.
njzk2
55
Parece onClick que establece el clickableatributo en Android 5.0 Lollipop (API 21). ¿Tal vez lo consideraron un error que esto no sucedió en versiones anteriores?
Mark Doliner el
¿Hay alguna manera de hacer esto con un clic largo a través de XML?
Amyth
52

Puede que esto no sea exactamente lo que está 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");
    }
});
Joshua Sutherland
fuente
28

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

Así es como se ejecuta un método cuando hace clic o toca 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"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 >
<LinearLayout android:id="@+id/LinearLayout01" android:layout_width="wrap_content"             android:layout_height="wrap_content"></LinearLayout>
<ListView android:id="@+id/ListView01" android:layout_width="wrap_content"   android:layout_height="wrap_content"></ListView>
<LinearLayout android:id="@+id/LinearLayout02" android:layout_width="wrap_content"   android:layout_height="wrap_content"></LinearLayout>

<TextView android:text="This is my first text"
 android:id="@+id/TextView01" 
 android:layout_width="wrap_content" 
 android:textStyle="bold"
 android:textSize="28dip"
 android:editable = "true"
 android:clickable="true"
 android:layout_height="wrap_content">
 </TextView>
 </LinearLayout>
Droide
fuente
13

Desde el interior de una actividad que llama un diseño y una vista de texto, este escucha de clics 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):

        <TextView
            android:id="@+id/tvGmail"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/menu_id_google"
            android:textSize="30sp" />

y en el archivo strings.xml

<string name="menu_id_google">Google ID (Gmail)</string>
Tony Gil
fuente
11

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


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

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="DONE"
    style="?android:attr/borderlessButtonStyle"/>
Confundir
fuente
7

en textView

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:onClick="onClick"
    android:clickable="true"

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

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

Probé esta solución funciona bien.

rp23b
fuente
3

Para hacer clic en una parte del texto (no el todo TextView), puede usar Htmlo Linkify(ambos crean enlaces que abren URL, sin embargo, no una devolución de llamada en la aplicación).

Linkify

Use un recurso de cadena como:

<string name="links">Here is a link: http://www.stackoverflow.com</string>

Luego en una vista de texto:

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

Html

Utilizando Html.fromHtml:

<string name="html">Here you can put html &lt;a href="http://www.stackoverflow.com"&gt;Link!&lt;/&gt;</string>

Luego, en su vista de texto:

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

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

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!

        }
    });
Marcelo Amaral
fuente