Як натиснути або натиснути на текст TextView


199

Я знаю, що це так просто (так ...), але я шукаю спосіб запустити метод натискання або клацання рядка тексту TextView в додатку для Android.

Я продовжую думати про слухачів кнопок та викликів слухачів анонімних методів, але це, схоже, не стосується TextView.

Чи може хтось вказати мені на якийсь фрагмент коду, щоб показати, як натискання або натискання на фрагмент тексту в TextView запускає метод?


64
Ви дійсно повинні прийняти найвищу відповідь.
Марек Себера

8
Для цього йому доведеться увійти.
Карл Андерсон

15
І він також забрав приємне ім’я користувача: /
MeetM

На майбутнє, якщо хтось використовує Котлін і хоче повністю контролювати текст, який можна натиснути, із зворотним дзвономTextView
Khan

Відповіді:


456

Ви можете встановити обробник кліків у xml за допомогою цього атрибута:

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

Не забудьте атрибут, що можна натиснути, без нього обробник кліків не викликається.

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
"Не забудьте атрибут, що можна натискати, без нього обробник кліків не викликається." Цей рядок збережено y день. Дякую, приятель.
N-JOY

2
developer.android.com/reference/android/view/… повинен згадати щось про можливість натискання. міг зекономити годину.
Тейлор

4
досить смішно, використовуючи setOnClickListenerнабір clickableатрибутів, але використання onClickатрибута, мабуть, ні.
njzk2

5
Схоже onClick , встановлено clickableатрибут в Android 5.0 Lollipop (API 21). Можливо, вони вважали помилкою, що цього не було в старих версіях?
Марк Долінер

Чи є спосіб зробити це для тривалого клацання через XML?
Еміт

52

Це може бути не зовсім те, що ви шукаєте, але це те, що працювало на те, що я роблю. Все це після мого 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

Гаразд, я відповів на власне запитання (але це найкращий спосіб?)

Ось як запустити метод при натисканні або натисканні на якийсь текст у 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");  
    }
}

і мій 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

зсередини діяльності, яка викликає макет і перегляд тексту, цей слухач кліків працює:

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

перегляд тексту оголошується таким (майстер за замовчуванням):

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

і у файлі strings.xml

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

11

Хоча ви можете вирішити проблему, встановивши слухача на перегляд тексту, рекомендується не робити цього. Ви повинні використовувати плоску кнопку, оскільки це підклас кнопки, і вона містить багато атрибутів, яких TextView не має.


Щоб використовувати плоску кнопку, додайте style="?android:attr/borderlessButtonStyle"атрибут -

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

7

в textView

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

Ви також повинні реалізувати View.OnClickListener і в методі On Click можна використовувати наміри

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

Я перевірив, що це рішення працює чудово.


3

Щоб натиснути на фрагмент тексту (не цілий TextView), ви можете використовувати Htmlабо Linkify(обидва створювати посилання, що відкривають URL-адреси, хоча це не зворотний дзвінок у додатку).

Linkify

Використовуйте рядовий ресурс, наприклад:

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

Потім у текстовому перегляді:

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

Html

Використання Html.fromHtml:

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

Потім у вашому текстовому перегляді:

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

0

Ви можете використовувати TextWatcher для TextView, є більш гнучким, ніж ClickLinstener (не найкраще чи гірше, лише один спосіб).

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!

        }
    });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.