Android - clickableSpan 和 TextView 的问题

Sam*_*zar 6 android

我正在尝试在 TextView 中实现可点击的主题标签,如下所示:

mTextView.setMovementMethod(LinkMovementMethod.getInstance());

Spannable s = (Spannable) mTextView.getText();
CharacterStyle clickableSpan = new MyClickableSpan();
s.setSpan(clickableSpan, startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

这按照我想要的方式处理我的主题标签的 onClick,但似乎文本的其他部分也侦听 onClick 事件并且不执行任何操作。

我的问题是如何制作不可跨越的文本部分,将 onClick 事件委托给父视图,如下图所示。

在此输入图像描述

Sam*_*zar 1

我用这个解决方案解决了我的问题,但如果有人有更好的解决方案,请告诉我。

我为我的 TextView 设置 OnClickListener ,并在 onClick 事件中获取 TextView 的父级,并检查父级是否可单击,然后执行父级 onClick 事件,如果不是,我递归获取父级的父级,直到实现可单击父级。通过这种方式,主题标签仍然可以通过自己的操作进行点击,并且当点击文本的另一部分时,父级的 onClick 事件将被执行。

这是我如何递归查找可点击父级的代码:

private View getParentClickable(View view) {
    try {
        if (((View) view.getParent()).isClickable()) {
            return (View) view.getParent();
        } else {
            return getParentClickable(((View) view.getParent()));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

然后为我的视图设置 OnClickListener :

mTextView.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       View parent = getParentClickable(mTextView);
       if (parent != null) parent.performClick();
   }
});
Run Code Online (Sandbox Code Playgroud)