Android ClickableSpan not calling onClick

前端 未结 4 1405
有刺的猬
有刺的猬 2020-11-30 18:58

I am creating a ClickableSpan, and it is displaying properly with the proper text underlined. However, the clicks are not registering. Do you know what I am doing wrong???

相关标签:
4条回答
  • 2020-11-30 19:40

    After some trial and error, the sequence of setting the tv.setMovementMethod(LinkMovementMethod.getInstance()); does matter.

    Here's my full code

    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());
    
    0 讨论(0)
  • 2020-11-30 19:50

    Have you tried setting the MovementMethod on the TextView that contains the span? You need to do that to make the clicking work...

    tv.setMovementMethod(LinkMovementMethod.getInstance());
    
    0 讨论(0)
  • 2020-11-30 19:57

    Direct Approach in 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
    
    0 讨论(0)
  • 2020-11-30 19:59

    Kotlin util function:

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

    Usage:

    Utils.setClickable(textView, subString, {handleClick()})
    
    0 讨论(0)
提交回复
热议问题