我正在使用这个库,但是从他们拥有的 onClick 样式来看,它们都不能处理我需要的情况。 https://github.com/splitwise/TokenAutoComplete
所以我想做我自己的。所以我有一个ContactsCompletionView
,这是一个TextView
。我覆盖onTouchEvent
这样的:
override fun onTouchEvent(event: MotionEvent): Boolean {
val action = event.actionMasked
val text = text
var handled = super.onTouchEvent(event)
if (isFocused && text != null && action == MotionEvent.ACTION_UP) {
val offset = getOffsetForPosition(event.x, event.y)
if (offset != -1) {
var offseted = text.substring(offset, text.length)
var indexLeft = offseted.indexOf("(") + 1
var indexRight = offseted.indexOf(")")
if (indexLeft > 0 && indexRight > indexLeft)
Toast.makeText(context, offseted.substring(indexLeft, indexRight), Toast.LENGTH_SHORT).show()
}
}
return handled
}
这是他们所拥有的,但我不能使用TokenImageSpan
,因为它是一个受保护的类:
@Override
public boolean onTouchEvent(@NonNull MotionEvent event) {
int action = event.getActionMasked();
Editable text = getText();
boolean handled = false;
if (tokenClickStyle == TokenClickStyle.None) {
handled = super.onTouchEvent(event);
}
if (isFocused() && text != null && lastLayout != null && action == MotionEvent.ACTION_UP) {
int offset = getOffsetForPosition(event.getX(), event.getY());
if (offset != -1) {
TokenImageSpan[] links = text.getSpans(offset, offset, TokenImageSpan.class);
if (links.length > 0) {
links[0].onClick();
handled = true;
} else {
//We didn't click on a token, so if any are selected, we should clear that
clearSelections();
}
}
}
if (!handled && tokenClickStyle != TokenClickStyle.None) {
handled = super.onTouchEvent(event);
}
return handled;
}
我的代码有效,但我的问题是,每当我在它的末尾按一个 TAG 时。它得到下一个对象。我认为这是因为我只是使用:
val offset = getOffsetForPosition(event.x, event.y)
if (offset != -1) {
var offseted = text.substring(offset, text.length)
}
当他们使用:
if (offset != -1) {
TokenImageSpan[] links = text.getSpans(offset, offset, TokenImageSpan.class);
}
TokenImageSpan
extends ImageSpan
,所以我可以这样使用它,但我不知道如何从ImageSpan
. 请问有什么办法可以解决这个问题吗?