#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(); Этот код находится в стадии разработки; Я оптимизировал его для удаления нежелательных переменных.