Come fare clic o toccare un testo TextView


199

So che è così semplice (doh ...) ma sto cercando un modo per eseguire un metodo toccando o facendo clic su una riga di testo TextView in un'app Android.

Continuo a pensare agli ascoltatori di pulsanti e alle chiamate anonime di listener di metodi, ma non sembra applicarsi a TextView.

Qualcuno può indicarmi uno snippet di codice per mostrare come fare clic o toccare un pezzo di testo in TextView esegue un metodo?


64
dovresti davvero accettare la risposta più in alto.
Marek Sebera,

8
Dovrebbe accedere per farlo.
Carl Anderson,

15
E ha anche portato via un bel nome utente: /
MeetM

Per il futuro, se qualcuno sta usando Kotlin e vuole avere il pieno controllo del testo cliccabile con callback - ho scritto un articolo su di esso per avere una funzione di estensione per TextView- link.medium.com/TLq6s8ltc3
Hossain Khan

Risposte:


456

Puoi impostare il gestore di clic in xml con questi attributi:

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

Non dimenticare l'attributo cliccabile, senza di esso, il gestore di clic non viene chiamato.

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) {
            ...
          }  
       }

60
"Non dimenticare l'attributo cliccabile, senza di esso, il gestore di clic non viene chiamato." Questa riga ti ha salvato il giorno. Grazie mille amico.
N-JOY,

2
developer.android.com/reference/android/view/… deve menzionare qualcosa su cui è possibile fare clic. avrebbe potuto risparmiare un'ora.
Taylor,

4
stranamente, usando setOnClickListenerimposta l' clickableattributo, ma onClickapparentemente usando l' attributo no.
njzk2,

5
Sembra onClick che imposta l' clickableattributo in Android 5.0 Lollipop (API 21). Forse lo consideravano un bug che ciò non accadeva nelle versioni precedenti?
Mark Doliner,

C'è un modo per farlo per un clic lungo tramite XML?
Amyth,

52

Questo potrebbe non essere esattamente quello che stai cercando, ma questo è ciò che ha funzionato per quello che sto facendo. Tutto questo è dopo il mio 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");
    }
});

28

OK ho risposto alla mia domanda (ma è il modo migliore?)

Ecco come eseguire un metodo quando fai clic o tocchi un po 'di testo in 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");  
    }
}

e il mio main.xml è:

<?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>

13

dall'interno di un'attività che chiama un layout e una visualizzazione di testo, questo listener di clic funziona:

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 di testo è dichiarata in questo modo (procedura guidata predefinita):

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

e nel file strings.xml

<string name="menu_id_google">Google ID (Gmail)</string>

11

Sebbene sia possibile risolvere il problema impostando il listener su textview, si consiglia di non farlo. Dovresti usare il pulsante flat in quanto è una sottoclasse di Button e fornisce molti attributi che TextView non ha.


Per utilizzare il pulsante piatto, aggiungi l' style="?android:attr/borderlessButtonStyle"attributo -

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

7

in textView

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

È inoltre necessario implementare View.OnClickListener e nel metodo Al clic è possibile utilizzare l'intento

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

Ho provato che questa soluzione funziona benissimo.


3

Per fare clic su una parte del testo (non sull'intero TextView), è possibile utilizzare Htmlo Linkify(entrambi creare collegamenti che aprono gli URL, tuttavia, non una richiamata nell'app).

Linkify

Utilizzare una risorsa stringa come:

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

Quindi in una visualizzazione di testo:

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

Html

Utilizzando Html.fromHtml:

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

Quindi nella visualizzazione del testo:

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

0

È possibile utilizzare TextWatcher per TextView, è più flessibile di ClickLinstener (non migliore o peggiore, solo più di un modo).

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!

        }
    });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.