2

我有一个SpannableString集合作为我的文本,TextView它位于另一个具有点击处理程序的视图中。我ClickableSpan的文本中有 s,你说得对,是可点击的。

我的问题是,如果在可点击范围内点击,我需要捕获触摸事件,而不是传播到父视图(因为父视图有另一个点击处理程序)。

容器视图只是我的应用程序中帖子的提要,这些帖子可以包含主题标签/提及/链接等。如果用户点击主题标签,他们应该转到由可点击跨度处理的主题标签,否则,他们应该去post,由容器自己处理。

是否有任何直接的机制来实现此功能?

4

2 回答 2

1

我想出了一个效果很好的糟糕的反模式解决方案。

在我的应用程序类中,我定义了:

public static boolean shouldIgnoreNextTouchEvent = false;

在我ClickableSpan的点击处理程序中,我设置了一个全局标志以避免下一次触摸事件为真:

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

然后在我的父视图的处理程序中:

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

我知道这不是一个好的解决方案,但它就像一个魅力。

于 2016-06-25T13:21:36.510 回答
0

交替,

  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 ...
    }

`

于 2017-12-09T23:53:05.487 回答