วิธีคลิกหรือแตะที่ข้อความ TextView


199

ฉันรู้ว่ามันง่ายมาก (doh ... ) แต่ฉันกำลังมองหาวิธีเรียกใช้วิธีการแตะหรือคลิกบรรทัด TextView ข้อความในแอป Android

ฉันนึกถึงผู้ฟังปุ่มและการเรียกใช้เมธอดแบบไม่ระบุชื่อ แต่ดูเหมือนจะไม่ใช้กับ TextView

ใครสามารถชี้ให้ฉันดูข้อมูลโค้ดเพื่อแสดงให้เห็นว่าการคลิกหรือการแตะบนข้อความใน TextView จะเรียกใช้วิธีการได้อย่างไร


64
คุณควรยอมรับคำตอบที่ดีที่สุด
Marek Sebera

8
เขาจะต้องเข้าสู่ระบบเพื่อทำเช่นนั้น
Carl Anderson

15
และเขาก็ใช้ชื่อผู้ใช้ที่ดี: /
MeetM

สำหรับอนาคตหากใครบางคนกำลังใช้ Kotlin และต้องการควบคุมข้อความที่คลิกได้ด้วยการโทรกลับ - ฉันเขียนบทความเกี่ยวกับเรื่องนี้เพื่อใช้ฟังก์ชันส่วนขยายสำหรับTextView- link.medium.com/TLq6s8ltc3
Hossain 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) บางทีพวกเขาคิดว่ามันเป็นข้อผิดพลาดที่ไม่ได้เกิดขึ้นในรุ่นที่เก่ากว่า?
Mark Doliner

มีวิธีการทำเช่นนี้สำหรับการคลิกที่ยาวนานผ่านทาง XML หรือไม่?
Amyth

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"

คุณต้องใช้ ViewOnClickListener และในวิธีการคลิกสามารถใช้ความตั้งใจ

    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!

        }
    });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.