Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: Change the background color of a ClickableSpan when clicked

Tags:

android

I have a SpannableString with a ClickableSpan as follows

for (int i = 0; i < items.size(); i++) {
            final SpannableString span = new SpannableString(items.get(i));
            final int index=i;

            span.setSpan(new ClickableSpan() {

                @Override
                public void onClick(View widget) {

                }

                @Override
                public void updateDrawState(TextPaint ds) {
                    ds.setColor(Color.LTGRAY);
                    ds.setUnderlineText(false);

                }
            }, 0, span.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

            builder.append(span);
        }

//my text view
txt.setText(builder);
txt.setMovementMethod(LinkMovementMethod.getInstance());

what I want to do is to change the foreground color of the span when clicked.

how can I do this ?

like image 935
Mina Wissa Avatar asked Apr 06 '13 13:04

Mina Wissa


2 Answers

If you're looking to get rid of the green highlight on selection, this is what you want to know:

Apparently, overriding public void updateDrawState(TextPaint ds) in your custom class would not affect the highlight color. It is only used for setting the underline color (or hiding/showing it).

All you need to do is: textView.setHighlightColor(Color.TRANSPARENT); where textView is what contains the ClickableSpan.

Hope it works for all of you. Feel free to ask any related question.

like image 157
Anish Kumar Avatar answered Oct 23 '22 10:10

Anish Kumar


I extended the clickableSpan class and passed it a flag that lets me know that I should highlight it.

SpannableStringBuilder tag;
.... tag.setSpan(new WordSpan(i, tokens[i], wordtohighlitedID) { 

.....

import android.graphics.Color;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.view.View;

public class WordSpan extends ClickableSpan 
{

    private int id;
    private TextPaint textpaint;
    public boolean shouldHilightWord = false;
    public WordSpan(int anID, String txt, int selected) {
        id =anID;
        // if the word selected is the same as the ID set the highlight flag
        if(selected == id)  {
            shouldHilightWord = true;

        }


    }

    @Override
    public void updateDrawState(TextPaint ds) {
        textpaint = ds;
        ds.setColor(ds.linkColor);
        if(shouldHilightWord){
            textpaint.bgColor = Color.GRAY;         
            textpaint.setARGB(255, 255, 255, 255);

        }
        //Remove default underline associated with spans
        ds.setUnderlineText(false);

    }

    public void changeSpanBgColor(View widget){
        shouldHilightWord = true;
        updateDrawState(textpaint);
        widget.invalidate();


    }
    @Override
    public void onClick(View widget) {

        // TODO Auto-generated method stub

    }


    /**
     * This function sets the span to record the word number, as the span ID
     * @param spanID
     */
    public void setSpanTextID(int spanID){
        id = spanID;
    }

    /**
     * Return the wordId of this span
     * @return id
     */
    public int getSpanTextID(){
        return id;
    }
}
like image 36
user2325031 Avatar answered Oct 23 '22 09:10

user2325031