首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安卓ClickableSpan不改变风格点击

安卓ClickableSpan不改变风格点击
EN

Stack Overflow用户
提问于 2016-06-22 19:56:35
回答 1查看 2.5K关注 0票数 1

我有一个TextView,所有的单词都可以单独点击。我想从每一个没有风格的词开始。单击一个单词时,该词应该成为并保持下划线。我可以清除默认下划线,但没有发生任何点击。(我正在捕捉甚至处理单击,但我无法更改Span样式)。

相关代码如下。提前谢谢你的帮助。

自定义ClickableSpan:

代码语言:javascript
运行
复制
class WordSpan extends ClickableSpan {
  private TextPaint textpaint;
  public boolean clicked = false;

  @Override
  public void updateDrawState(TextPaint ds) {
    textpaint = ds;
    ds.setUnderlineText(false);

    if (clicked)
      ds.setUnderlineText(true);
  }

  @Override
  public void onClick(View v) {}

  public void setClicked(boolean c) {
    clicked = c;
    updateDrawState(textpaint);
  }
}

在onCreate()中,我解析一个txt文件并将每个单词添加到TextView中。在这个解析循环中,我有以下代码:

代码语言:javascript
运行
复制
  SpannableString ss = new SpannableString(word.toString());

  WordSpan clickableSpan = new WordSpan() {
    @Override
    public void onClick(View view) {
    setClicked(true);
    view.invalidate();
    }};

  ss.setSpan(clickableSpan, 0, word.toString().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

  tvText.append(ss);
  tvText.append(" ");
}

tvText.setMovementMethod(LinkMovementMethod.getInstance());
EN

Stack Overflow用户

回答已采纳

发布于 2016-06-28 17:56:24

要使单个单词可点击,您必须向可扩展字符串中添加多个可单击跨度。例如,要使"foo“和"bar”在单个Textview中单独单击,您必须添加两个可单击的跨度,一个用于"foo“,另一个用于"bar”,并将它们添加到可扩展字符串中。

在本例中,为了简单起见,我使用空格拆分了字符串,另外,您还必须为单击span编写逻辑。

删除下划线的可点击范围。此外,您还可以配置背景和文本的颜色单击。如果你不打算使用它,你可以移除它。

代码语言:javascript
运行
复制
import android.text.TextPaint;
import android.text.style.ClickableSpan;

public abstract class TouchableSpan  extends ClickableSpan {
    private boolean mIsPressed;
    private int mPressedBackgroundColor;
    private int mNormalTextColor;
    private int mPressedTextColor;
    private int mBackgroundColor;

    public TouchableSpan(int normalTextColor,int backgroundColor, int pressedTextColor, int pressedBackgroundColor) {
        mBackgroundColor = backgroundColor;
        mNormalTextColor = normalTextColor;
        mPressedTextColor = pressedTextColor;
        mPressedBackgroundColor = pressedBackgroundColor;
    }

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

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setColor(mIsPressed ? mPressedTextColor : mNormalTextColor);
        ds.bgColor = mIsPressed ? mPressedBackgroundColor : mBackgroundColor;
        ds.setUnderlineText(!mIsPressed);
    }
}

创建一个LinkMovementMethod,它将照顾您的跨度。如果您删除颜色规定,您也可以改变这一点。

代码语言:javascript
运行
复制
import android.text.Layout;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.view.MotionEvent;
import android.widget.TextView;

public class LinkTouchMovementMethod extends LinkMovementMethod {

    private TouchableSpan mPressedSpan;

    @Override
    public boolean onTouchEvent(TextView textView, Spannable spannable, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            mPressedSpan = getPressedSpan(textView, spannable, event);
            if (mPressedSpan != null) {
                mPressedSpan.setPressed(true);
                Selection.setSelection(spannable, spannable.getSpanStart(mPressedSpan),
                        spannable.getSpanEnd(mPressedSpan));
            }
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            TouchableSpan touchedSpan = getPressedSpan(textView, spannable, event);
            if (mPressedSpan != null && touchedSpan != mPressedSpan) {
                mPressedSpan.setPressed(false);
                mPressedSpan = null;
                Selection.removeSelection(spannable);
            }
        } else {
            if (mPressedSpan != null) {
                mPressedSpan.setPressed(false);
                super.onTouchEvent(textView, spannable, event);
            }
            mPressedSpan = null;
            Selection.removeSelection(spannable);
        }
        return true;
    }

    private TouchableSpan getPressedSpan(TextView textView, Spannable spannable, MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();

        x -= textView.getTotalPaddingLeft();
        y -= textView.getTotalPaddingTop();

        x += textView.getScrollX();
        y += textView.getScrollY();

        Layout layout = textView.getLayout();
        int line = layout.getLineForVertical(y);
        int off = layout.getOffsetForHorizontal(line, x);

        TouchableSpan[] link = spannable.getSpans(off, off, TouchableSpan.class);
        TouchableSpan touchedSpan = null;
        if (link.length > 0) {
            touchedSpan = link[0];
        }
        return touchedSpan;
    }

}

然后,您可以以下列方式使用它:

代码语言:javascript
运行
复制
TextView textView = (TextView)findViewById(R.id.hello_world);
String fooBar = "asdfasdfasdfasf asdfasfasfasd";
String[] clickSpans = fooBar.split(" ");
int clickSpanLength = clickSpans.length;
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
int totalLength = 0;
int normalColor = getResources().getColor(android.R.color.black);
int clickColor = getResources().getColor(android.R.color.holo_blue_bright);
String separator = " , ";
int separatorLength = separator.length();
for (int i = 0; i < clickSpanLength; i++) {
    int currentWordLength = clickSpans[i].length();
    spannableStringBuilder.append(clickSpans[i]);
    if (i < clickSpanLength - 1) {
        spannableStringBuilder.append(" , ");
    }

    spannableStringBuilder.setSpan(new TouchableSpan(normalColor, Color.TRANSPARENT, clickColor, Color.TRANSPARENT) {
        @Override
        public void onClick(View widget) {

        }
    }, totalLength, totalLength + currentWordLength, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    totalLength = totalLength + currentWordLength + separatorLength;
}

textView.setText(spannableStringBuilder);
textView.setMovementMethod(new LinkTouchMovementMethod());
票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37977148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档