Como clicar ou tocar em um texto do TextView

199

Eu sei que isso é tão fácil (doh ...), mas estou procurando uma maneira de executar um método tocando ou clicando em uma linha de texto TextView em um aplicativo Android.

Continuo pensando nos ouvintes de botão e nas chamadas de ouvintes de métodos anônimos, mas isso parece não se aplicar ao TextView.

Alguém pode me indicar algum trecho de código para mostrar como clicar ou tocar em um pedaço de texto em um TextView executa um método?

andróide
fonte
64
você realmente deve aceitar a resposta mais importante.
Marek Sebera 22/03
8
Ele teria que fazer login para fazer isso.
Carl Anderson
15
E ele também tirou um bom nome de usuário: /
MeetM
Para o futuro, se alguém estiver usando o Kotlin e quiser ter controle total sobre o texto clicável com retorno de chamada - escrevi um artigo sobre ele para ter uma função de extensão para TextView- link.medium.com/TLq6s8ltc3
Hossain Khan

Respostas:

456

Você pode definir o manipulador de cliques no xml com estes atributos:

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

Não se esqueça do atributo clicável, sem ele, o manipulador de cliques não é chamado.

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
fonte
60
"Não se esqueça do atributo clicável, sem ele, o manipulador de cliques não é chamado." Esta linha economizou y dia. Muito obrigado amigo.
N / JOY
2
developer.android.com/reference/android/view/… precisa mencionar algo sobre clicável. poderia ter economizado uma hora.
Taylor
4
engraçado, o uso de setOnClickListenerdefine o clickableatributo, mas o uso onClickaparentemente não o faz.
njzk2
5
Parece onClick que define o clickableatributo no Android 5.0 Lollipop (API 21). Talvez eles tenham considerado um bug que isso não aconteceu em versões mais antigas?
Mark Doliner
Existe uma maneira de fazer isso por um longo clique via XML?
Amyth
52

Pode não ser exatamente o que você está procurando, mas é o que funcionou para o que estou fazendo. Tudo isso é depois do meu 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
fonte
28

OK, eu respondi minha própria pergunta (mas é a melhor maneira?)

Veja como executar um método quando você clica ou toca em algum texto em um 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 meu 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>
andróide
fonte
13

de dentro de uma atividade que chama um layout e uma visualização de texto, esse ouvinte de clique 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());
                }
            }
        });

a visualização de texto é declarada assim (assistente padrão):

        <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 no arquivo strings.xml

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

Embora você possa resolver o problema configurando o ouvinte como textview, é recomendável não. Você deve usar o botão simples , pois é uma subclasse de Button e fornece muitos atributos que o TextView não fornece.


Para usar o botão simples, adicione o style="?android:attr/borderlessButtonStyle"atributo -

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

em textView

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

Você também deve implementar View.OnClickListener e o método On Click pode usar intent

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

Eu testei esta solução funciona bem.

rp23b
fonte
3

Para clicar em uma parte do texto (não no todo TextView), você pode usar Htmlou Linkify(ambos, criar links que abrem URLs, mas não um retorno de chamada no aplicativo).

Linkify

Use um recurso de string como:

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

Em seguida, em uma visualização de texto:

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

Html

Usando Html.fromHtml:

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

Então, na sua visualização de texto:

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

Você pode usar o TextWatcher for TextView, é mais flexível que o ClickLinstener (não é o melhor ou o pior, apenas mais uma maneira).

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
fonte