Cara mengklik atau mengetuk teks TextView

199

Saya tahu ini sangat mudah (doh ...) tetapi saya sedang mencari cara untuk menjalankan metode mengetuk atau mengklik baris teks TextView di Aplikasi Android.

Saya terus berpikir tentang pendengar tombol dan panggilan pendengar metode anonim, tetapi sepertinya tidak berlaku untuk TextView.

Dapatkah seseorang mengarahkan saya ke beberapa cuplikan kode untuk menunjukkan bagaimana mengklik atau mengetuk sepotong teks di TextView menjalankan metode?

Droid
sumber
64
Anda harus benar-benar menerima jawaban teratas.
Marek Sebera
8
Dia harus masuk untuk melakukan itu.
Carl Anderson
15
Dan dia juga telah mengambil nama pengguna yang bagus: /
MeetM
Untuk masa depan, jika seseorang menggunakan Kotlin dan ingin memiliki kontrol penuh atas teks yang dapat diklik dengan callback - saya menulis artikel tentang hal itu untuk memiliki fungsi ekstensi untuk TextView- link.medium.com/TLq6s8ltc3
Hossain Khan

Jawaban:

456

Anda bisa mengatur handler klik dalam xml dengan atribut ini:

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

Jangan lupa atribut yang dapat diklik, tanpa itu, penangan klik tidak dipanggil.

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
sumber
60
"Jangan lupa atribut yang dapat diklik, tanpa itu, penangan klik tidak dipanggil." Baris ini disimpan y hari. Terima kasih banyak kawan.
N-JOY
2
developer.android.com/reference/android/view/… perlu menyebutkan sesuatu tentang diklik. bisa menghemat satu jam.
taylor
4
cukup lucu, menggunakan setOnClickListenerset clickableatribut, tetapi menggunakan onClickatribut ternyata tidak.
njzk2
5
Sepertinya onClick tidak mengatur clickableatribut di Android 5.0 Lollipop (API 21). Mungkin mereka menganggapnya sebagai bug yang tidak terjadi pada versi yang lebih lama?
Mark Doliner
Apakah ada cara untuk melakukan ini dengan klik panjang melalui XML?
Amyth
52

Ini mungkin bukan yang Anda cari tetapi ini yang berhasil untuk apa yang saya lakukan. Semua ini setelah saya 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
sumber
28

OK saya telah menjawab pertanyaan saya sendiri (tetapi apakah itu cara terbaik?)

Ini adalah cara menjalankan metode ketika Anda mengklik atau mengetuk beberapa teks di 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");  
    }
}

dan main.xml saya adalah:

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

dari dalam aktivitas yang memanggil tata letak dan tampilan teks, pendengar klik ini berfungsi:

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

tampilan teks dinyatakan seperti ini (wisaya default):

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

dan dalam file strings.xml

<string name="menu_id_google">Google ID (Gmail)</string>
tony gil
sumber
11

Meskipun Anda dapat menyelesaikan masalah dengan mengatur pendengar ke tampilan teks, disarankan untuk tidak melakukannya. Anda harus menggunakan tombol datar karena merupakan subkelas Tombol dan menyediakan banyak atribut yang tidak dimiliki TextView.


Untuk menggunakan tombol rata, tambahkan style="?android:attr/borderlessButtonStyle"atribut -

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

di textView

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

Anda juga harus menerapkan View.OnClickListener dan dalam metode On Click dapat menggunakan maksud

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

Saya menguji solusi ini berfungsi dengan baik.

rp23b
sumber
3

Untuk mengklik sepotong teks (bukan keseluruhan TextView), Anda dapat menggunakan Htmlatau Linkify(keduanya membuat tautan yang membuka url, meskipun, bukan panggilan balik dalam aplikasi).

Linkify

Gunakan sumber daya string seperti:

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

Kemudian dalam tampilan teks:

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

Html

Menggunakan Html.fromHtml:

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

Kemudian di tampilan teks Anda:

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

Anda dapat menggunakan TextWatcher untuk TextView, lebih fleksibel daripada ClickLinstener (bukan yang terbaik atau lebih buruk, hanya lebih satu arah).

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
sumber