Cách nhấp hoặc nhấn vào văn bản TextView


199

Tôi biết điều này rất dễ dàng (doh ...) nhưng tôi đang tìm cách để chạy một phương thức khi chạm hoặc nhấp vào một dòng văn bản TextView trong Ứng dụng Android.

Tôi tiếp tục suy nghĩ về trình nghe nút và các cuộc gọi người nghe phương thức ẩn danh, nhưng dường như nó không áp dụng cho TextView.

Ai đó có thể chỉ cho tôi một số đoạn mã để hiển thị cách nhấp hoặc nhấn vào một đoạn văn bản trong TextView chạy một phương thức không?


64
bạn thực sự nên chấp nhận câu trả lời hàng đầu.
Marek Sebera

8
Anh ấy sẽ phải đăng nhập để làm điều đó.
Carl Anderson

15
Và anh ấy cũng đã lấy đi một tên người dùng đẹp: /
MeetM

Trong tương lai, nếu ai đó đang sử dụng Kotlin và muốn có toàn quyền kiểm soát văn bản có thể nhấp bằng gọi lại - Tôi đã viết một bài viết về nó để có chức năng mở rộng cho TextView- link.medium.com/TLq6s8ltc3
Hossain Khan

Câu trả lời:


456

Bạn có thể đặt trình xử lý nhấp trong xml với các thuộc tính sau:

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

Đừng quên thuộc tính có thể nhấp, nếu không có nó, trình xử lý nhấp không được gọi.

tệp chính

    ...

    <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
"Đừng quên thuộc tính có thể nhấp, nếu không có nó, trình xử lý nhấp không được gọi." Dòng này đã lưu y ngày. Cảm ơn rất nhiều bạn.
N-JOY

2
developer.android.com/reference/android/view/ tầm cần đề cập đến một cái gì đó về có thể nhấp. có thể đã tiết kiệm được một giờ.
taylor

4
đủ vui, sử dụng setOnClickListenerbộ clickablethuộc tính, nhưng sử dụng onClickthuộc tính rõ ràng là không.
njzk2

5
Nó có vẻ như onClick không thiết lập các clickablethuộc tính trong Android 5.0 Lollipop (API 21). Có lẽ họ coi đó là một lỗi mà điều này đã không xảy ra trong các phiên bản cũ hơn?
Đánh dấu Doliner

Có cách nào để thực hiện việc này khi nhấp dài qua XML không?
Amyth 17/03/2015

52

Đây có thể không hoàn toàn là những gì bạn đang tìm kiếm nhưng đây là những gì làm việc cho những gì tôi đang làm. Tất cả điều này là sau của tôi 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 tôi đã trả lời câu hỏi của riêng mình (nhưng đó có phải là cách tốt nhất không?)

Đây là cách chạy một phương thức khi bạn bấm hoặc chạm vào một số văn bản trong 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");  
    }
}

và tệp chính của tôi là:

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

từ bên trong một hoạt động gọi bố cục và chế độ xem văn bản, trình nghe nhấp này hoạt động:

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

chế độ xem văn bản được khai báo như thế này (trình hướng dẫn mặc định):

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

và trong tệp String.xml

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

11

Mặc dù bạn có thể giải quyết vấn đề bằng cách đặt trình nghe thành textview, nhưng không nên. Bạn nên sử dụng nút phẳng vì đây là lớp con của Nút và nó cung cấp nhiều thuộc tính mà TextView không có.


Để sử dụng nút phẳng, thêm style="?android:attr/borderlessButtonStyle"thuộc tính -

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

7

trong textView

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

Bạn cũng phải triển khai View.OnClickListener và trong phương thức On Click có thể sử dụng ý định

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

Tôi đã thử nghiệm giải pháp này hoạt động tốt.


3

Để nhấp vào một đoạn văn bản (không phải toàn bộ TextView), bạn có thể sử dụng Htmlhoặc Linkify(cả hai tạo liên kết mở url, tuy nhiên, không phải là một cuộc gọi lại trong ứng dụng).

Linkify

Sử dụng tài nguyên chuỗi như:

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

Sau đó, trong một văn bản:

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

Html

Sử dụng Html.fromHtml:

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

Sau đó, trong văn bản của bạn:

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

0

Bạn có thể sử dụng TextWatcher cho TextView, linh hoạt hơn ClickLinstener (không tốt nhất hoặc tệ hơn, chỉ có một cách).

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!

        }
    });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.