Android ClickableSpan не вызывает onClick
Я создаю 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);
3 ответа:
вы пробовали установить MovementMethod на TextView, который содержит span? Вы должны сделать это, чтобы сделать щелчок работу...
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()})