Android ClickableSpan ไม่ได้โทรคลิก


150

ฉันกำลังสร้าง ClickableSpan และมันแสดงผลอย่างถูกต้องพร้อมกับข้อความที่ถูกขีดเส้นใต้ อย่างไรก็ตามการคลิกไม่ได้ลงทะเบียน คุณรู้ไหมว่าฉันทำอะไรผิด ???

ขอบคุณผู้ชนะ

นี่คือข้อมูลโค้ด:

view.setText("This is a test");
ClickableSpan span = new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        log("Clicked");
    }
};
view.getText().setSpan(span, 0, view.getText().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

คำตอบ:


430

คุณได้ลองตั้งค่า MovementMethod บน TextView ที่มีการขยายหรือไม่? คุณต้องทำเช่นนั้นเพื่อให้การคลิกทำงาน ...

tv.setMovementMethod(LinkMovementMethod.getInstance());

ไม่ทำงานได้ดีหากtvเป็นประเภท EditText จริงคุณสามารถคลิกที่ช่วง แต่ไม่สามารถแก้ไขได้ตามปกติ
มะเดื่อ -GHD742

ขอบคุณมาก! มันก็ใช้ได้ผลสำหรับฉันเช่นกัน! คุณช่วยอธิบายฉันเกี่ยวกับการตั้งค่านี้ได้อย่างไร
alfo888_ibg

63
แน่นอนฉันต้องตั้งค่าสิ่งที่เอกสารเรียกว่า "ตัวจัดการปุ่มลูกศร" เพื่อให้ตัวจัดการการคลิกทำงาน ชัดเจนมาก! (╯°□°) ╯︵ ┻━┻
adamdport

มันใช้งานได้ แต่ฉันจะไม่มีทางรู้ว่าทำไมมันจึงไม่ใช่พฤติกรรมเริ่มต้น
EpicPandaForce

และ Google ลืมที่จะพูดถึงว่าการเรียก setMovementMethod ทำให้ "ellipsize" ไม่ทำงาน ... ดังนั้นดูเหมือนว่าวิธีการที่ถูกต้องคือการใช้ TouchListener ด้วยตนเองและนำมาจากที่นั่น ...
slott

4

หลังจากการทดลองและข้อผิดพลาดบางอย่างลำดับของการตั้งค่าtv.setMovementMethod(LinkMovementMethod.getInstance());ไม่สำคัญ

นี่คือรหัสเต็มของฉัน

String stringTerms = getString(R.string.sign_up_terms);
Spannable spannable = new SpannableString(stringTerms);
int indexTermsStart = stringTerms.indexOf("Terms");
int indexTermsEnd = indexTermsStart + 18;
spannable.setSpan(new UnderlineSpan(), indexTermsStart, indexTermsEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ForegroundColorSpan(getColor(R.color.theme)), indexTermsStart, indexTermsEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        Log.d(TAG, "TODO onClick.. Terms and Condition");
    }
}, indexTermsStart, indexTermsEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

int indexPolicyStart = stringTerms.indexOf("Privacy");
int indexPolicyEnd = indexPolicyStart + 14;
spannable.setSpan(new UnderlineSpan(), indexPolicyStart, indexPolicyEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ForegroundColorSpan(getColor(R.color.theme)), indexPolicyStart, indexPolicyEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        Log.d(TAG, "TODO onClick.. Privacy Policy");
    }
}, indexPolicyStart, indexPolicyEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

TextView textViewTerms = (TextView) findViewById(R.id.sign_up_terms_text);
textViewTerms.setText(spannable);
textViewTerms.setClickable(true);
textViewTerms.setMovementMethod(LinkMovementMethod.getInstance());

4

ฟังก์ชั่น Kotlin util:

fun setClickable(textView: TextView, subString: String, handler: () -> Unit, drawUnderline: Boolean = false) {
    val text = textView.text
    val start = text.indexOf(subString)
    val end = start + subString.length

    val span = SpannableString(text)
    span.setSpan(ClickHandler(handler, drawUnderline), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

    textView.linksClickable = true
    textView.isClickable = true
    textView.movementMethod = LinkMovementMethod.getInstance()

    textView.text = span
}

class ClickHandler(
        private val handler: () -> Unit,
        private val drawUnderline: Boolean
) : ClickableSpan() {
    override fun onClick(widget: View?) {
        handler()
    }

    override fun updateDrawState(ds: TextPaint?) {
        if (drawUnderline) {
            super.updateDrawState(ds)
        } else {
            ds?.isUnderlineText = false
        }
    }
}

การใช้งาน:

Utils.setClickable(textView, subString, {handleClick()})

1

วิธีการโดยตรงใน Kotlin

  val  textHeadingSpannable = SpannableString(resources.getString(R.string.travel_agent))


           val clickSpan = object : ClickableSpan(){
               override fun onClick(widget: View) {

                // Handel your click
               }
           }
            textHeadingSpannable.setSpan(clickSpan,104,136,Spannable.SPAN_INCLUSIVE_EXCLUSIVE)

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