Bir TextView metnine tıklamak veya üzerine dokunun


200

Bu çok kolay (doh ...) biliyorum ama bir Android App metin TextView satırına dokunarak veya tıklayarak bir yöntem çalıştırmak için bir yol arıyorum.

Düğme dinleyicileri ve anonim yöntem dinleyici çağrıları hakkında düşünmeye devam ediyorum, ancak TextView için geçerli görünmüyor.

Birisi bir TextView'da bir metne tıklamanın veya dokunmanın bir yöntemi çalıştırdığını göstermek için bazı kod snippet'ini gösterebilir mi?


64
en üstteki cevabı gerçekten kabul etmelisin.
Marek Sebera

8
Bunu yapmak için giriş yapması gerekir.
Carl Anderson

15
Ayrıca güzel bir kullanıcı adı aldı: /
MeetM

Gelecek için, birisi Kotlin kullanıyorsa ve geri arama ile tıklanabilir metin üzerinde tam kontrole sahip olmak istiyorsa - bunun için bir uzatma işlevine sahip olmak için bir makale yazdım TextView- link.medium.com/TLq6s8ltc3
Hossain Khan

Yanıtlar:


457

Tıklama işleyicisini xml biçiminde şu özelliklerle ayarlayabilirsiniz:

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

Tıklanabilir özelliği unutmayın, onsuz tıklama işleyicisi çağrılmaz.

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
"Tıklanabilir özelliği unutmayın, onsuz tıklama işleyicisi çağrılmaz." Bu hat y günü kurtardı. Çok teşekkürler dostum.
N-JOY

2
developer.android.com/reference/android/view/… tıklanabilir hakkında bir şeyden bahsetmek gerekiyor. bir saat kazanmış olabilir.
taylor

4
yeterince tuhaf, kullanarak özniteliği setOnClickListenerayarlar clickable, ancak onClickgörünüşe göre özniteliği kullanmaz .
njzk2

5
Gibi görünüyor onClick mu set clickableAndroid 5.0 Lollipop (API 21) 'de niteliği. Belki de bunun daha eski versiyonlarda gerçekleşmediğini düşünüyorlardı?
Mark Doliner

XML ile uzun tıklama için bunu yapmanın bir yolu var mı?
Amyth

52

Bu aradığınız şey olmayabilir, ancak yaptığım şey için işe yaradı. Bütün bunlar benim peşimden 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

Tamam kendi sorumu cevapladım (ama en iyi yol bu mu?)

Bir TextView içindeki bir metne tıkladığınızda veya dokunduğunuzda bir yöntemi şu şekilde çalıştırabilirsiniz:

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

ve main.xml dosyam:

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

bir düzen ve metin görünümü çağıran bir etkinliğin içinden bu tıklama dinleyici çalışır:

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

metin görünümü şu şekilde bildirilir (varsayılan sihirbaz):

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

ve strings.xml dosyasında

<string name="menu_id_google">Google ID (Gmail)</string>

11

Dinleyiciyi metin görüntüsüne ayarlayarak sorunu çözebilmenize rağmen, yapmamanız önerilir. Button'ın bir alt sınıfı olduğu ve TextView'ın kullanmadığı birçok özellik sağladığı için düz düğmeyi kullanmalısınız .


Düz düğmeyi kullanmak için style="?android:attr/borderlessButtonStyle"özellik ekleyin -

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

7

textView içinde

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

Ayrıca View.OnClickListener uygulamanız gerekir ve Tıklamada yöntemi niyeti kullanabilir

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

Bu çözümün iyi çalıştığını test ettim.


3

Metnin bir parçasını (tamamını değil TextView) tıklamak için Htmlveya uygulamasını kullanabilirsiniz Linkify(her ikisi de uygulamada geri arama değil, URL'leri açan bağlantılar oluşturabilir).

Linkify

Şunun gibi bir dize kaynağı kullanın:

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

Sonra bir metin görünümünde:

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

Html

Kullanma Html.fromHtml:

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

Sonra metin görünümünüzde:

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

0

TextView için TextWatcher'ı kullanabilirsiniz, ClickLinstener'dan daha esnektir (en iyi veya daha kötü değil, sadece bir yoldan daha fazla).

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!

        }
    });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.