点击ClickableSpan时的高亮效果

35

我有一个小问题,需要在点击ClickableSpan时删除或自定义这个橙色的高亮显示。以下是我扩展了ClickableSpan的类:

public class InternalClickableSpan extends ClickableSpan {

    private String clicked;

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

    public InternalClickableSpan(String clickedString) {
        clicked = clickedString;
    }

    @Override
    public void onClick(View view) {
        Selection.setSelection((Spannable) ((TextView)view).getText(), 0);
        Toast toast = Toast.makeText(mContext, clicked, Toast.LENGTH_SHORT);
        toast.show();
    }
}

这是我在文本视图中使用它的方式

Spannable spans = (Spannable) tv.getText();      
spans.setSpan(new InternalClickableSpan(contacts[i]), text.indexOf(contacts[i]),   text.indexOf(contacts[i])+contacts[i].length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

有人知道如何自定义Spannable对象的"onclick高亮"吗?

编辑:感谢Aleadam的回复,我重写了updateDrawState(请查看我的InternalClickableSpan类中的第一个方法),但是我无法找到任何自定义此高亮的方法。还有其他想法吗?谢谢


尝试覆盖updateDrawState()方法吗?http://developer.android.com/reference/android/text/style/ClickableSpan.html#updateDrawState%28android.text.TextPaint%29 - Aleadam
@Aleadam 谢谢您的回复,我正在重写 updateDrawState(请查看我的 InternalClickableSpan 类中的第一个方法),但我找不到任何自定义此高亮的方法。有其他想法吗?谢谢 - Robert
13
我理解了,要禁用高亮显示,我们需要在TextView上使用setHighlightColor(Color.TRANSPARENT)方法。 - Robert
7个回答

31

您可以这样覆盖 onClick(View widget)

        @Override
        public void onClick(View widget) {
            // do what must happen after click event.
            widget.invalidate();
        }

它对我有用。节省了大量时间。谢谢伙计!! - moDev
@hasanghaforian,可扩展字符串的高亮显示默认启用吗? - DIRTY DAVE
1
谢谢您的回答。但是我使用了 widget.postInvalidate() - UNW
@DIRTYDAVE 我也遇到过这种情况,它被突出显示了。 - Hanako

24

这将删除任何高亮。

tv.setHighlightColor(Color.TRANSPARENT);

15

输入图片说明

ClickableSpan linkClick = new ClickableSpan() {
    @Override
    public void onClick(View view) {
        Toast.makeText(getApplicationContext(), "Link Click",
                Toast.LENGTH_SHORT).show();
        view.invalidate();
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        if (textView.isPressed()) {
            ds.setColor(Color.BLUE);
        } else {
            ds.setColor(Color.RED);
        }
        textView.invalidate();
    }
};
textView.setHighlightColor(Color.TRANSPARENT);

Spannable spannableString = new SpannableString("Link in TextView");
spannableString.setSpan(linkClick, 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(spannableString, TextView.BufferType.SPANNABLE);
textView.setMovementMethod(LinkMovementMethod.getInstance());

2
多个可点击的span怎么样? - Shihab Uddin
1
它正在工作。但是就像@ShihabUddin所说,有没有一种方法可以在单个TextView上实现多个ClickableSpans? - LuckMan

0

您可以替换默认的高亮颜色 android:textColorHighlight

    <TextView
    android:id="@+id/tv_tip"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#727998"
    android:textColorHighlight="@android:color/transparent"
    tools:text="@string/_tip" />

或禁用焦点


0
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:id="@+id/LinearLayout01"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout android:id="@+id/LinearLayout02"
        android:layout_height="50px"
        android:layout_width="fill_parent"
        // Layout Click enable
        android:clickable="true"
        // Setting Highlight Option in background property
        android:background="@android:drawable/list_selector_background" />
    </LinearLayout>
</LinearLayout>

请参考帮助文档了解如何在编辑器中格式化代码。 - McDowell

0

只需使用这个...

view.setSelector(new ColorDrawable(Color.TRANSPARENT));

1
仅适用于列表视图。 - Daniel Wilson

-1
textView.setText(myString);
Linkify.addLinks(textView,Linkify.ALL);

这对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接