ClickableSpan избегать сенсорного распространения в родительском представлении

У меня есть SpannableString установить как текст моего TextView который находится внутри другого представления, которое имеет обработчик щелчка. у меня есть ClickableSpanвнутри моего текста, вы правы, кликабельны.

Моя проблема в том, что мне нужно, чтобы события касания регистрировались в случае щелчка внутри кликабельного диапазона, а не для распространения в родительское представление (так как у родителя есть другой обработчик щелчков).

Контейнерное представление - это просто лента сообщений в моем приложении, и эти сообщения могут содержать хэштеги / упоминания / ссылки и т. Д. Если пользователь нажимает на хэштег, он должен перейти к хэштегу, который обрабатывается кликабельным диапазоном, в противном случае он должен перейти к сообщению, которое обрабатывается самим контейнером.

Есть ли простой механизм для реализации этой функциональности?

2 ответа

Решение

Я придумала ужасное, анти-шаблонное решение, которое хорошо работает.

В моем классе приложения я определил:

public static boolean shouldIgnoreNextTouchEvent = false;

В моем ClickableSpans обработчик щелчка, я установил глобальный флаг, чтобы избежать следующего события касания к истине:

ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        App.shouldIgnoreNextTouchEvent = true;
        ...
    }
 }

Тогда в обработчике моего родительского представления:

@Override
public void onClick() {
    if(App.shouldIgnoreNextTouchEvent){
        App.shouldIgnoreNextTouchEvent = false;
        return;
    }
    ...
}

Я знаю, что это не очень хорошее решение, но оно работает как шарм.

С другой стороны,

  1. Добавьте тег в виджет, который сгенерировал событие нажатия

`

 ClickableSpan clickableSpan = new ClickableSpan() {
           @Override
            public void onClick(View widget) {
                widget.setTag("hashtag"); // or anything else
            }
     }

`

  1. В родительском элементе проверьте наличие тега. Если это так, это было использовано 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 ...
    }

`

Другие вопросы по тегам