Несколько кликов в текстовом представлении

#android #textview

#Android #textview

Вопрос:

У меня есть функция для создания интерактивных тегов для textview. Это выглядит следующим образом:

     private CharSequence tagsBuilder(String text, String token) {
    SpannableStringBuilder builtTags = new SpannableStringBuilder();
    int start = 0, end = 0;

    for(int i = 0; i < 5; i  ) {
        start = 0;
        end = text.indexOf(token, 0);

        try {
            if(start < end) {
                SpannableStringBuilder ssb = new SpannableStringBuilder(text.substring(start, end));
                ssb.setSpan(new ClickableSpan() {
                    @Override
                    public void onClick(View v)
                    {

                        Log.i("DEBUGTAG", "Span clicked - "   ((TextView) v).getText());
                    }
                }, start, end, 0);

                builtTags.append(ssb);
                builtTags.append(" ");
                text = text.substring(end   1);
            }
        } catch (IndexOutOfBoundsException e) {
            break;
        }
    }

    return builtTags;
}
  

Я вижу textview с 5 индивидуально кликабельными тегами. Но проблема в том, что журнал, который печатается для любого тега, по которому щелкнули, представляет собой весь текст textview.

Я делаю что-то не так здесь? Как мне получить текст отдельных тегов, на которые были нажаты.

Ответ №1:

Ваша строка журнала выглядит следующим образом:

 Log.i("DEBUGTAG", "Span clicked - "   ((TextView) v).getText());
  

Это регистрирует содержимое TextView . Итак … вы получаете текст TextView . Если вы хотите попасть token туда, вам придется скопировать это.

Вот что вы можете попробовать:

 private CharSequence tagsBuilder(String text, final String token) {
SpannableStringBuilder builtTags = new SpannableStringBuilder();
int start = 0, end = 0;

for(int i = 0; i < 5; i  ) {
    start = 0;
    end = text.indexOf(token, 0);

    try {
        if(start < end) {
            SpannableStringBuilder ssb = new SpannableStringBuilder(text.substring(start, end));
            ssb.setSpan(new ClickableSpan() {
                private String mText = token;
                @Override
                public void onClick(View v)
                {

                    Log.i("DEBUGTAG", "Span clicked - "   mText);
                }
            }, start, end, 0);

            builtTags.append(ssb);
            builtTags.append(" ");
            text = text.substring(end   1);
        }
    } catch (IndexOutOfBoundsException e) {
        break;
    }
}

return builtTags;
}
  

Комментарии:

1. Моя ошибка, я должен был назвать параметр соответствующим образом. Токен в параметре на самом деле является разделителем. В настоящее время «,» передается для разбиения строк, разделенных запятой, на токены.

2. Ах да, я не очень внимательно читал ваш код. Тогда просто замените мое использование token на нужную вам подстроку. Однако ваш код выглядит не так, start всегда равен 0…

3. Большое спасибо за помощь, кабуко. Я не вдавался глубоко в ваше первоначальное предложение, но теперь я его понимаю. Это сработало с небольшой модификацией — окончательная строка mText = ssb.toString(); Этот код находится в стадии разработки; Я оптимизировал его для удаления нежелательных переменных.