반응형
Android ClickableSpan이 Click을 호출하지 않음
클릭 가능한 범위를 만들고 있는데, 적절한 텍스트 밑줄이 그어져 제대로 표시되고 있습니다.그러나 클릭이 등록되지 않습니다.제가 뭘 잘못하고 있는지 아세요??
고마워요 빅터
코드 스니펫은 다음과 같습니다.
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);
스팬이 포함된 TextView에서 Movement Method를 설정해 보았습니까?클릭을 하려면 그렇게 해야 합니다.
tv.setMovementMethod(LinkMovementMethod.getInstance());
코틀린 유틸리티 함수:
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()})
약간의 시행착오 후에, 설정의 순서는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());
코틀린에서의 직접접근
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
언급URL : https://stackoverflow.com/questions/8641343/android-clickablespan-not-calling-onclick
반응형
'source' 카테고리의 다른 글
C 함수의 인수와 C 함수의 오버로드에 대한 기본값 (0) | 2023.10.23 |
---|---|
VS 2012에서 웹 배포 게시 작업 전에만 PowerShell 스크립트를 실행하는 방법은 무엇입니까? (0) | 2023.10.23 |
jQuery 객체 및 DOM 요소 (0) | 2023.10.23 |
이 호환되는 기능 타입들이 C에 있습니까? (0) | 2023.10.23 |
'루프' 외부에 워드프레스 'Comments Template' 표시 (0) | 2023.10.18 |