ClickableSpan AND onClickListener on TextView



我需要在TextView上同时拥有这两个:单击TextView时,触发一个函数。但当点击文本的某个部分时,会触发一个不同的函数。

因此,我有一个用于特定部分的ClickableSpan,以及一个用于整个TextView:的OnTouchListener

SpannableString string = new SpannableString(input);
// ...
string.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
functionOne();
}
}, start, i, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(string);
// ...
textView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
});

两者都适合自己:

如果我不添加OnTouchListener,它会调用从ClickableSpan触发的functionOne()

但如果我也添加了OnTouchListener,它只调用gestureDetector.onTouchEvent(event)。此外,如果我点击文本的某个部分,其中应触发ClickableSpan。


我怎么能两者都有?

因此,如果单击某个部分,则会触发ClickableSpan,如果单击文本的不同部分,则调用gestureDetector.onTouchEvent(event)

尝试下面的函数可以实现可点击的span,而无需调用触摸监听器。click事件将由ClickableSpan处理。

fun setClickableSpan(
spannable: Spannable,
paths: ArrayList<String>,
listener: EventListener
) {
for (i in paths.indices) {
val indexOfPath = spannable.toString().indexOf(paths[i])
if (indexOfPath == -1) {
continue
}
val clickableSpan: ClickableSpan = object : ClickableSpan() {
override fun onClick(textView: View) {
listener.onItemClick(textView, i, paths[i])
}
}
spannable.setSpan(
clickableSpan, indexOfPath,
indexOfPath + paths[i].length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
}
}

最新更新