Android ClickableSpan onClick पर कॉल नहीं कर रहा है


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

क्या आपने TextView पर MovementMethod सेट करने की कोशिश की है जिसमें स्पैन शामिल है? क्लिक करने का काम करने के लिए आपको यह करना होगा ...

tv.setMovementMethod(LinkMovementMethod.getInstance());

अच्छी तरह से काम न करें यदि tvएडिट टाइप का है, तो आप स्पैन पर क्लिक कर सकते हैं लेकिन इसे सामान्य रूप से एडिट न करें।
FIG-GHD742

बहुत धन्यवाद! यह मेरे लिए भी काम है! क्या आप मुझे इस सेटिंग के बारे में बता सकते हैं?
alfo888_ibg

63
बेशक, मुझे यह निर्धारित करने की आवश्यकता है कि क्लिक हैंडलर काम करने के लिए दस्तावेज़ीकरण "तीर कुंजी हैंडलर" को क्या कहता है। इतना स्पष्ट! (┻━┻ °) °) ╯︵ ad
adamdport

यह काम करता है, लेकिन मैं वास्तव में कभी नहीं जान पाऊंगा कि डिफ़ॉल्ट व्यवहार क्यों नहीं है।
एपिकपांडफर्सेज

और Google यह उल्लेख करना भूल गया कि कॉलिंग मेमोमेंटमेथोड "ellipsize" को काम नहीं करता है ... इसलिए ऐसा लगता है कि सही दृष्टिकोण मैन्युअल रूप से एक टचलिस्ट को लागू करना है और इसे वहां से ले जाना है ...
स्लॉट दें।

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

कोटलिन उपयोग समारोह:

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

कोटलिन में प्रत्यक्ष दृष्टिकोण

  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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.