Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ClickableSpan不调用onClick_Android_Textview - Fatal编程技术网

Android ClickableSpan不调用onClick

Android ClickableSpan不调用onClick,android,textview,Android,Textview,我正在创建一个ClickableSpan,并使用 适当的文本加下划线。但是,点击没有注册。 你知道我做错了什么吗 谢谢,维克多 以下是代码片段: view.setText(“这是一个测试”); ClickableSpan=新的ClickableSpan(){ @凌驾 公共void onClick(视图小部件){ 日志(“点击”); } }; view.getText().setSpan(span,0,view.getText().length(),span.span_EXCLUSIVE_EXCL

我正在创建一个ClickableSpan,并使用 适当的文本加下划线。但是,点击没有注册。 你知道我做错了什么吗

谢谢,维克多

以下是代码片段:

view.setText(“这是一个测试”);
ClickableSpan=新的ClickableSpan(){
@凌驾
公共void onClick(视图小部件){
日志(“点击”);
}
};
view.getText().setSpan(span,0,view.getText().length(),span.span_EXCLUSIVE_EXCLUSIVE);

您是否尝试过在包含跨度的TextView上设置MovementMethod?你需要这样做,使点击工作

tv.setMovementMethod(LinkMovementMethod.getInstance());

经过一些尝试和错误,设置
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());
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()})

科特林直接进近

  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

如果
tv
类型为EditText,则工作不正常。确实,您可以单击范围,但不能像正常情况下那样编辑。非常感谢!这对我来说也是工作!你能解释一下为什么要这样设置吗?当然,我需要设置文档中所称的“箭头键处理程序”,以使单击处理程序工作。太明显了!(╯°□°)╯︵ ┻━┻这是可行的,但我永远也不知道为什么这不是默认行为。谷歌忘了提到调用setMovementMethod会使“ellipsize”不起作用……因此,似乎正确的方法是手动实现TouchListener并从那里开始。。。