【问题标题】:ClickableSpan avoid touch propagation to parent viewClickableSpan 避免触摸传播到父视图
【发布时间】:2016-10-27 23:14:49
【问题描述】:

我有一个SpannableString 设置为我的TextView 的文本,它位于另一个具有点击处理程序的视图中。我的文字中有ClickableSpans,你说得对,可点击。

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

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

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

【问题讨论】:

  • 在所有可点击的跨度中使用变量.. 相应地设置它们.. 并使用反对忽略 parentclick
  • @sush 我只是在写我的答案。我实际上完全按照你说的做了,而且奏效了。

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


【解决方案1】:

或者,

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

`

【讨论】:

    【解决方案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;
        }
        ...
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      • 2017-04-28
      • 2012-11-12
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多