我正在尝试将数据存储在ClickableSpan中,就像使用setTag()和其他类型的元素一样。
我在stackoverflow中读到了这个答案: SpannableString - setTag
它清楚地说: - 创建自己的ClickableSpan子类,保存所需的数据,并将其应用于SpannableString。 - 当您创建ClickableSpan并通过数据成员向其附加单词时,您将可以访问onClick()
中的数据但我有点像新手,无法弄清楚如何编码。
我正在使用一个扩展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);
评论:我知道理想情况下我应该澄清我所链接问题的评论部分,但我没有足够的声誉这样做。
答案 0 :(得分:1)
像这样定义你的类:
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 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类。
答案 1 :(得分:1)
我认为解决方案是使用自定义类中的自定义函数,这样可以使用
// 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);