首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何确定在TextView中是否触摸了链接或纯文本

在TextView中确定是否触摸了链接或纯文本,可以通过以下步骤进行:

  1. 创建一个自定义的TextView子类,并重写onTouchEvent方法来监听触摸事件。
代码语言:txt
复制
public class LinkTextView extends TextView {

    private OnLinkClickListener onLinkClickListener;

    public LinkTextView(Context context) {
        super(context);
    }

    public LinkTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LinkTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setOnLinkClickListener(OnLinkClickListener listener) {
        this.onLinkClickListener = listener;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        CharSequence text = getText();
        Spannable spannable = Spannable.Factory.getInstance().newSpannable(text);
        int action = event.getAction();

        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
            int x = (int) event.getX();
            int y = (int) event.getY();

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

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

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

            ClickableSpan[] linkSpans = spannable.getSpans(off, off, ClickableSpan.class);

            if (linkSpans.length != 0) {
                if (action == MotionEvent.ACTION_UP) {
                    linkSpans[0].onClick(this);
                    if (onLinkClickListener != null) {
                        onLinkClickListener.onLinkClick();
                    }
                } else if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(spannable, spannable.getSpanStart(linkSpans[0]), spannable.getSpanEnd(linkSpans[0]));
                }
                return true;
            } else {
                Selection.removeSelection(spannable);
            }
        }

        return super.onTouchEvent(event);
    }

    public interface OnLinkClickListener {
        void onLinkClick();
    }
}
  1. 在布局文件中使用自定义的LinkTextView。
代码语言:txt
复制
<com.example.LinkTextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Your text with links here"
    android:autoLink="web" />
  1. 在代码中设置链接点击事件监听器。
代码语言:txt
复制
LinkTextView textView = findViewById(R.id.textView);
textView.setOnLinkClickListener(new LinkTextView.OnLinkClickListener() {
    @Override
    public void onLinkClick() {
        // 处理链接点击事件
    }
});

通过以上步骤,你可以在TextView中确定是否触摸了链接或纯文本,并对链接点击事件进行相应的处理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Android开发笔记(一百四十六)仿支付宝的支付密码输入框

    编辑框EditText算是Android的一个基础控件了,表面上看,EditText只负责接收用户手工输入的文本;可实际上,要把这看似简单的文本输入做得方便易用,并不是一个简单的事情。因为用户可能希望App会更加智能一些,比如用户希望编辑框提供关键词联想功能,又比如用户希望编辑框能够自我纠错等等;所以,Android从设计之初就努力尝试解决这些问题,先是自带了自动完成编辑框AutoCompleteTextView,后来又在Android5.0以后提供了文本输入布局TextInputLayout。 然而,计划赶不上变化,开发工作中总有一些现有控件无法直接实现的需求,就像支付宝的支付密码输入框,在一排方格区域内输入并显示密文密码,每个密文字符之间又有竖线分隔。为直观理解支付密码输入框的业务需求,下面还是先看看该输入框的最终效果图。

    03

    Android Studio 知识储备 之 ✨-基础知识学习历程

    所有的资源文件都会在R.java文件下生成对应的资源id,我们可以直接通过资源id访问到对应的资源。使用mipmap会在图片缩放在提供一定的性能优化,分辨率不同系统会根据屏幕分辨率来选择hdpi,mdpi,xmdpi,xxhdpi下的对应图片,所以你解压别人的apk可以看到上述目录同一名称的图片,在四个文件夹下都有,只是大小和像素不一样而已!当然,这也不是绝对的,比如我们把所有的图片都丢在了drawable-hdpi下的话,即使手机 本该加载ldpi文件夹下的图片资源,但是ldpi下没有,那么加载的还会是hdpi下的图片! 另外,还有一种情况:比如是hdpi,mdpi目录下有,ldpi下没有,那么会加载mdpi中的资源! 原则是使用最接近的密度级别!另外如果你想禁止Android不跟随屏幕密度加载不同文件夹的资源,只需在AndroidManifest.xml文件中添加android:anyDensity="false"字段即可!

    03
    领券