ClickableSpan避免触摸传播到父视图

时间:2016-06-25 12:33:04

标签: android android-view onclicklistener android-4.0-ice-cream-sandwich clickablespan

我将SpannableString设置为TextView的文本,该文本位于另一个具有点击处理程序的视图中。我的文字中有ClickableSpan个,你是对的,可以点击。

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

容器视图只是我应用中的帖子提要,这些帖子可以包含主题标签/提及/链接等。如果用户点击主题标签,他们应该转到由可点击范围处理的主题标签,否则,他们应该去邮局,邮箱由集装箱本身处理。

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

2 个答案:

答案 0 :(得分:1)

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

在我的app类中,我定义了:

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

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

答案 1 :(得分:0)

或者,

  1. 向生成点击事件的小部件添加标记
  2. `

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

    `

    1. 在父级中,检查标签是否存在。如果是,则ClickableSpan消耗了
    2. `

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

      `