Android ClickableSpan không gọi trên Click


150

Tôi đang tạo ClickableSpan và nó đang hiển thị đúng với văn bản phù hợp được gạch chân. Tuy nhiên, các nhấp chuột không được đăng ký. Bạn có biết tôi đang làm gì sai không ???

Cảm ơn, Victor

Đây là đoạn mã:

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

Câu trả lời:


430

Bạn đã thử thiết lập MovementMethod trên TextView có chứa span chưa? Bạn cần phải làm điều đó để làm cho việc nhấp chuột ...

tv.setMovementMethod(LinkMovementMethod.getInstance());

Không hoạt động tốt nếu tvthuộc loại EditText, đúng là bạn có thể nhấp vào nhịp nhưng không chỉnh sửa như bình thường.
FIG-GHD742

cảm ơn nhiều! Nó cũng làm việc cho tôi! bạn có thể giải thích cho tôi bằng cách nào về thiết lập này?
alfo888_ibg

63
KHÓA HỌC Tôi cần đặt tài liệu gọi là "trình xử lý phím mũi tên" để làm cho trình xử lý nhấp chuột hoạt động. Quá rõ ràng! (╯ ° □ ° ╯︵ ┻ ┻
adamdport 30/03/2015

Nó hoạt động, nhưng tôi sẽ không bao giờ thực sự biết tại sao đó không phải là hành vi mặc định.
EpicPandaForce

Và Google đã quên đề cập rằng việc gọi setMovementMethod làm cho "ellipsize" không hoạt động ... Vì vậy, có vẻ như cách tiếp cận chính xác là triển khai TouchListener theo cách thủ công và lấy nó từ đó ...
slott

4

Sau một số thử nghiệm và lỗi, trình tự thiết lập tv.setMovementMethod(LinkMovementMethod.getInstance());vấn đề.

Đây là mã đầy đủ của tôi

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

Chức năng sử dụng Kotlin:

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

Sử dụng:

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

1

Cách tiếp cận trực tiếp trong 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
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.