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?


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

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");
    }
});

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>

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>

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"/>

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.


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)));

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!

        }
    });
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.