Как нажать или нажать на текст TextView


200

Я знаю, что это так легко (дох ...), но я ищу способ запустить метод, нажав или щелкнув строку текста TextView в приложении для Android.

Я продолжаю думать о слушателях кнопок и анонимных вызовах слушателей методов, но, похоже, это не относится к TextView.

Может ли кто-нибудь указать мне на фрагмент кода, чтобы показать, как нажатие или нажатие на фрагмент текста в TextView запускает метод?


64
Вы должны действительно принять самый верный ответ.
Марек Себера

8
Он должен войти в систему, чтобы сделать это.
Карл Андерсон

15
И он также забрал хорошее имя пользователя: /
MeetM

На будущее, если кто-то использует Kotlin и хочет иметь полный контроль над интерактивным текстом с помощью обратного вызова - я написал статью об этом, чтобы иметь функцию расширения для TextView- link.medium.com/TLq6s8ltc3
Хоссейн Хан

Ответы:


457

Вы можете установить обработчик клика в xml с этим атрибутом:

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

Не забудьте атрибут clickable, без него обработчик нажатия не вызывается.

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
«Не забудьте атрибут clickable, без него обработчик нажатия не вызывается». Эта строка сохранила ваш день. Большое спасибо, приятель.
N-JOY

2
developer.android.com/reference/android/view/… необходимо упомянуть кое-что о clickable. мог бы сэкономить час.
Тейлор

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

Хотя вы можете решить проблему, установив для слушателя текстовое представление, рекомендуется этого не делать. Вы должны использовать плоскую кнопку, так как она является подклассом Button, и она предоставляет множество атрибутов, которых нет у 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.