web-dev-qa-db-fra.com

Comment cliquer ou taper sur un texte TextView

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

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

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

181
Droid

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 cela, 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) {
            ...
          }  
       }
440
Patrick Cullen

Ce n'est peut-être pas tout à fait ce que vous cherchez, mais c'est ce qui a fonctionné pour ce que je fais. Tout cela après ma 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");
    }
});
40
Joshua Sutherland

OK j'ai répondu à ma propre question (mais est-ce le meilleur moyen?)

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

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>
27
Droid

à l'intérieur d'une activité qui appelle une mise en page et une vue en 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>
13
tony gil

Bien que vous puissiez résoudre le problème en définissant le programme d'écoute sur textview, il est recommandé de ne pas le faire. Vous devez utiliser flat button car il s’agit d’une sous-classe de Button qui fournit de nombreux attributs que TextView ne possède pas.


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

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

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

6
rp23b

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

Linkify

Utilisez une ressource de chaîne telle que:

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

Puis dans un textview:

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

Html

Utiliser 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 textview:

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

Vous pouvez utiliser TextWatcher pour TextView, est plus souple que ClickLinstener (pas mieux ou 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!

        }
    });
0
Marcelo Amaral