android - 单击时更改 TextView 的背景颜色

标签 android textview android-styles

在某些应用程序中,例如 Plaid甚至是 Chrome 浏览器,文本的某些部分带有下划线,以表明它们是可点击的链接,可以打开浏览器窗口或新标签页。单击这些链接时,整个文本的背景颜色变为下划线颜色。我试过查看 Plaid 的来源来复制这种效果,但没有成功。我要实现的是这种效果:

enter image description here

最佳答案

我认为这部分代码产生了这种效果:

https://github.com/nickbutcher/plaid/blob/61d59644d5ae9e373f93cef10e0438c50e2eea6d/app/src/main/java/io/plaidapp/util/LinkTouchMovementMethod.java

其实是基于这个问题:

Change the text color of a single ClickableSpan when pressed without affecting other ClickableSpans in the same TextView

public class LinkTouchMovementMethod extends LinkMovementMethod {


private static LinkTouchMovementMethod instance;
private TouchableUrlSpan pressedSpan;

public static MovementMethod getInstance() {
    if (instance == null)
        instance = new LinkTouchMovementMethod();

    return instance;
}

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

private TouchableUrlSpan 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);

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

关于android - 单击时更改 TextView 的背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33600549/

相关文章:

java - Android Studio 无法解析符号,但代码正确执行

android - 如何计算日期?我有天数 + 开始日期和查找结束日期

android - 无法从android studio上的github导入项目

Android TextView通过循环添加文字

android - 当您将主题应用于 Activity/应用程序并将样式应用于 View 时会发生什么?

java - 如何通过从 ListView 或 android 中的微调器中选择选项来更改应用程序主题?

android - Android中的HtmlUnit错误:任务执行失败: 'app:preDexDebug'

android - 如何将 TextView 的值转换为整数

android - 如果文本比 View 长,动态 TextView 不会选取框

java - 更改 DatePicker 标题文本颜色 Android