Comment cliquer ou appuyer sur un texte TextView

200

Je sais que c'est si facile (doh ...) mais je cherche un moyen d'exécuter une méthode en appuyant ou en cliquant sur une ligne de texte TextView dans une application Android.

Je continue de penser aux écouteurs de boutons et aux appels d'écouteurs de méthodes anonymes, mais cela ne semble tout simplement pas s'appliquer à TextView.

Quelqu'un peut-il me pointer vers un extrait de code pour montrer comment cliquer ou appuyer sur un morceau de texte dans une TextView exécute une méthode?

Droid
la source
64
vous devez vraiment accepter la réponse la plus élevée.
Marek Sebera
8
Il faudrait qu'il se connecte pour le faire.
Carl Anderson
15
Et il a également emporté un joli nom d'utilisateur: /
MeetM
Pour l'avenir, si quelqu'un utilise Kotlin et veut avoir un contrôle total sur le texte cliquable avec rappel - j'ai écrit un article à ce sujet pour avoir une fonction d'extension pour TextView- link.medium.com/TLq6s8ltc3
Hossain Khan

Réponses:

457

Vous pouvez définir le gestionnaire de clics en xml avec ces attributs:

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

N'oubliez pas l'attribut cliquable, sans lui, le gestionnaire de clics n'est pas appelé.

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
la source
60
"N'oubliez pas l'attribut cliquable, sans lui, le gestionnaire de clics n'est pas appelé." Cette ligne a sauvé y jour. Merci beaucoup mon pote.
N-JOY
2
developer.android.com/reference/android/view/… doit mentionner quelque chose sur cliquable. aurait pu sauver une heure.
taylor
4
assez curieusement, l'utilisation setOnClickListenerdéfinit l' clickableattribut, mais l'utilisation de l' onClickattribut ne le fait apparemment pas.
njzk2
5
Il semble que onClick cela définisse l' clickableattribut dans Android 5.0 Lollipop (API 21). Peut-être qu'ils considéraient comme un bug que cela ne se produisait pas dans les anciennes versions?
Mark Doliner
Existe-t-il un moyen de le faire pour un clic long via XML?
Amyth
52

Ce n'est peut-être pas tout à fait ce que vous recherchez, mais c'est ce qui a fonctionné pour ce que je fais. Tout cela est après mon 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
la source
28

OK, j'ai répondu à ma propre question (mais est-ce la meilleure façon?)

Voici comment exécuter une méthode lorsque vous cliquez ou appuyez sur du texte dans 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");  
    }
}

et mon main.xml est:

<?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>
Droid
la source
13

depuis l'intérieur d'une activité qui appelle une mise en page et une vue de texte, cet écouteur de clics fonctionne:

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 vue texte est déclarée comme ceci (assistant par défaut):

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

et dans le fichier strings.xml

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

Bien que vous puissiez résoudre le problème en définissant l'écouteur sur TextView, il est recommandé de ne pas le faire. Vous devez utiliser le bouton plat car il s'agit d'une sous-classe de Button et il fournit de nombreux attributs que TextView ne fournit pas.


Pour utiliser le bouton plat, ajoutez un style="?android:attr/borderlessButtonStyle"attribut -

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

dans textView

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

Vous devez également implémenter View.OnClickListener et dans la méthode On Click peut utiliser l'intention

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

J'ai testé cette solution fonctionne bien.

rp23b
la source
3

Pour cliquer sur une partie du texte (pas sur la totalité TextView), vous pouvez utiliser Htmlou Linkify(les deux créent des liens qui ouvrent des URL, cependant, pas un rappel dans l'application).

Linkify

Utilisez une ressource de chaîne comme:

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

Puis dans une vue texte:

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

Html

En utilisant Html.fromHtml:

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

Puis dans votre affichage de texte:

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

Vous pouvez utiliser TextWatcher pour TextView, est plus flexible que ClickLinstener (ni meilleur ni pire, seulement plus dans un sens).

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
la source