TextView с промежутками, как я могу узнать, какой из них нажат?
Я использую эту библиотеку, но из имеющихся у них стилей 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
расширяет ImageSpan
, так что я могу использовать это так, но я не знаю, как взять текст из ImageSpan
. Есть идеи, как я могу это исправить?
2 ответа
Вы можете использовать интерактивный диапазон, как показано ниже:
SpannableString ss = new SpannableString("your string comes
here");
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View textView) {
//do your stuff here on click
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
};
//set click range
ss.setSpan(clickableSpan, 8, 15,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//your text view or edittext
textView.setText(ss);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(Color.TRANSPARENT);
Вот что я использовал:
override fun onTouchEvent(event: MotionEvent): Boolean {
val action = event.actionMasked
val text = text
var handled = super.onTouchEvent(event)
var offset = getOffsetForPosition(event.getX(), event.getY())
if (isFocused && text != null && action == MotionEvent.ACTION_UP) {
var cursor = this@ContactsCompletionView.selectionEnd
if (cursor < 0)
cursor = 0
val links: Array<ViewSpan> = text.getSpans(0, cursor, ViewSpan::class.java)
if (objects.size > 0 && objects.size >= links.size && links.size > 0 && offset < cursor)
Snackbar().make(this, objects[links.size - 1].address, com.google.android.material.snackbar.Snackbar.LENGTH_SHORT).show()
}
return handled
}
Библиотека, если для ClickStyle установлено значение NONE, она перемещает курсор в конец выбранного объекта. Итак, я создаю из этого подстроку, проверяю, сколько у меня промежутков, а затем использую это как индекс для своих объектов. чтобы отобразить первый слева от курсора