ClickableSpan 避免触摸传播到父视图
ClickableSpan avoid touch propagation to parent view
我有一个 SpannableString
设置为我的 TextView
的文本,它位于另一个具有点击处理程序的视图中。我的文本中有 ClickableSpan
s,你说得对,可以点击。
我的问题是我需要在可点击范围内点击时捕获触摸事件,并且不传播到父视图(因为父视图有另一个点击处理程序).
容器视图只是我应用程序中 post 的提要,那些 post 可以包含 hashtags/mentions/links 等。如果用户点击主题标签,他们应该去到由可点击范围处理的主题标签,否则,他们应该转到由容器本身处理的post。
是否有任何直接的机制来实现此功能?
我想出了一个糟糕的反模式解决方案,但效果很好。
在我的应用程序 class 中,我定义了:
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;
}
...
}
我知道这不是一个好的解决方案,但它非常有效。
或者,
- 向生成点击事件的小部件添加标签
`
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 ...
}
`
我有一个 SpannableString
设置为我的 TextView
的文本,它位于另一个具有点击处理程序的视图中。我的文本中有 ClickableSpan
s,你说得对,可以点击。
我的问题是我需要在可点击范围内点击时捕获触摸事件,并且不传播到父视图(因为父视图有另一个点击处理程序).
容器视图只是我应用程序中 post 的提要,那些 post 可以包含 hashtags/mentions/links 等。如果用户点击主题标签,他们应该去到由可点击范围处理的主题标签,否则,他们应该转到由容器本身处理的post。
是否有任何直接的机制来实现此功能?
我想出了一个糟糕的反模式解决方案,但效果很好。
在我的应用程序 class 中,我定义了:
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;
}
...
}
我知道这不是一个好的解决方案,但它非常有效。
或者,
- 向生成点击事件的小部件添加标签
`
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 ...
}
`