Java 将标记添加到ClickableSpan

Java 将标记添加到ClickableSpan,java,android,clickable,spannablestring,Java,Android,Clickable,Spannablestring,我试图将数据存储在可单击的范围内,就像可以使用setTag()和其他类型的元素一样 我在stackoverflow中读到了这个答案: 它清楚地说: -创建自己的ClickableSpan子类,该子类保存所需的数据,并将其应用于您的SpannableString。 -当您创建ClickableSpan并通过数据成员向其附加单词时,您将可以在onClick()中访问该数据 但我是个新手,不知道如何编写代码 我正在使用一个扩展ClickableSpan的类来创建我的ClickableSpan: //

我试图将数据存储在可单击的范围内,就像可以使用setTag()和其他类型的元素一样

我在stackoverflow中读到了这个答案:

它清楚地说: -创建自己的ClickableSpan子类,该子类保存所需的数据,并将其应用于您的SpannableString。 -当您创建ClickableSpan并通过数据成员向其附加单词时,您将可以在onClick()中访问该数据

但我是个新手,不知道如何编写代码

我正在使用一个扩展ClickableSpan的类来创建我的ClickableSpan:

// CLASS BEING IMPORTED
public abstract class TouchableSpan extends ClickableSpan {

    // IMPLEMENT SET TAG FUNCTION HERE??

}

// CODE ON ACTIVITY
TouchableSpan touchableSpan = new TouchableSpan() {

    @Override
    public void onClick(View widget) {
        this.setPressed(true);

        // GET TAG INFO HERE. BUT HOW?
    }

    // SET TAG HERE? BUT HOW?

    private boolean mIsPressed;

    public void setPressed(boolean isSelected) {
        mIsPressed = isSelected;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setColor(Color.BLACK);
        ds.bgColor = mIsPressed ? selectedHlColor : 0xffeeeeee;
        ds.setUnderlineText(false);
    }
}

spannablesstringbuilder.setSpan(touchableSpan, index+2, index2, 0);

评论:我知道我应该要求澄清我链接的问题的评论部分,但我没有足够的声誉这样做。

这样定义你的班级:

    public abstract class TouchableSpan extends ClickableSpan {
    private Object mTag;

    public void setTag(Object tag) {
        mTag = tag;
    }

    public Object getTag() {
        return mTag;
    }   

    @Override
    public void onClick(View widget) {
        this.setPressed(true);

        // GET TAG INFO HERE. BUT HOW?
        // Just access mTag here
    }

    private boolean mIsPressed;

    public void setPressed(boolean isSelected) {
        mIsPressed = isSelected;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setColor(Color.BLACK);
        ds.bgColor = mIsPressed ? selectedHlColor : 0xffeeeeee;
        ds.setUnderlineText(false);
    }
}
TouchableSpan touchableSpan = new TouchableSpan();
touchableSpan.setTag("tag"); // you can use any Object here, e.g. a String
spannablesstringbuilder.setSpan(touchableSpan, index+2, index2, 0);
然后像这样创建您的TouchableSpan:

    public abstract class TouchableSpan extends ClickableSpan {
    private Object mTag;

    public void setTag(Object tag) {
        mTag = tag;
    }

    public Object getTag() {
        return mTag;
    }   

    @Override
    public void onClick(View widget) {
        this.setPressed(true);

        // GET TAG INFO HERE. BUT HOW?
        // Just access mTag here
    }

    private boolean mIsPressed;

    public void setPressed(boolean isSelected) {
        mIsPressed = isSelected;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setColor(Color.BLACK);
        ds.bgColor = mIsPressed ? selectedHlColor : 0xffeeeeee;
        ds.setUnderlineText(false);
    }
}
TouchableSpan touchableSpan = new TouchableSpan();
touchableSpan.setTag("tag"); // you can use any Object here, e.g. a String
spannablesstringbuilder.setSpan(touchableSpan, index+2, index2, 0);

您也可以使用原来的方法,将ClickableSpan扩展两次,但这可能更干净,您可以在其他活动或项目中重复使用TouchableSpan类。

我认为解决方案是在自定义类中使用自定义函数,这样做可能会奏效

// CLASS BEING IMPORTED
public abstract class TouchableSpan extends ClickableSpan {

  // IMPLEMENT SET TAG FUNCTION HERE??

  //COMMENT: YES, LIKE THIS: CAN BE ANY FUNCTION U LIKE

  private String myCustomVar;

  public String getMyVar(){
  return this.myCustomVar;
  }

  public void setMyVar(String myVari){
  this.myCustomVar = myVari;
  return;
  }

}

// CODE ON ACTIVITY
TouchableSpan touchableSpan = new TouchableSpan() {

  @Override
  public void onClick(View widget) {
      this.setPressed(true);

      // GET TAG INFO HERE. BUT HOW?

      //COMMENT: LIKE THIS: 

      String extravar = touchableSpan.getMyVar();
      Log.d("TEST", extravar);
  }

  // SET TAG HERE? BUT HOW?

  COMMENT: NOT HERE. SEE BELOW

  private boolean mIsPressed;

  public void setPressed(boolean isSelected) {
      mIsPressed = isSelected;
  }

  @Override
  public void updateDrawState(TextPaint ds) {
      super.updateDrawState(ds);
      ds.setColor(Color.BLACK);
      ds.bgColor = mIsPressed ? selectedHlColor : 0xffeeeeee;
      ds.setUnderlineText(false);
  }
}

//COMMENT: SET YOUR VARIABLE/TAG HERE:

touchableSpan.setMyVar("HOLALA");

spannablesstringbuilder.setSpan(touchableSpan, index+2, index2, 0);

工作起来很有魅力。格雷西亚斯·卡波!(顺便说一句,另一个答案也是绝对正确的,但我喜欢这一个的内联评论)