ClickableSpan избегать сенсорного распространения в родительском представлении
У меня есть SpannableString
установить как текст моего TextView
который находится внутри другого представления, которое имеет обработчик щелчка. у меня есть ClickableSpan
внутри моего текста, вы правы, кликабельны.
Моя проблема в том, что мне нужно, чтобы события касания регистрировались в случае щелчка внутри кликабельного диапазона, а не для распространения в родительское представление (так как у родителя есть другой обработчик щелчков).
Контейнерное представление - это просто лента сообщений в моем приложении, и эти сообщения могут содержать хэштеги / упоминания / ссылки и т. Д. Если пользователь нажимает на хэштег, он должен перейти к хэштегу, который обрабатывается кликабельным диапазоном, в противном случае он должен перейти к сообщению, которое обрабатывается самим контейнером.
Есть ли простой механизм для реализации этой функциональности?
2 ответа
Я придумала ужасное, анти-шаблонное решение, которое хорошо работает.
В моем классе приложения я определил:
public static boolean shouldIgnoreNextTouchEvent = false;
В моем ClickableSpan
s обработчик щелчка, я установил глобальный флаг, чтобы избежать следующего события касания к истине:
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
App.shouldIgnoreNextTouchEvent = true;
...
}
}
Тогда в обработчике моего родительского представления:
@Override
public void onClick() {
if(App.shouldIgnoreNextTouchEvent){
App.shouldIgnoreNextTouchEvent = false;
return;
}
...
}
Я знаю, что это не очень хорошее решение, но оно работает как шарм.
С другой стороны,
- Добавьте тег в виджет, который сгенерировал событие нажатия
`
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
widget.setTag("hashtag"); // or anything else
}
}
`
- В родительском элементе проверьте наличие тега. Если это так, это было использовано ClickableSpan
`
@Override
public void onClick(View view) {
String tag = (String) view.getTag();
if(tag.equals("hashtag"){
// Already consumed by child (ClickableSpan)
return;
}
// rest of your code ...
}
`