同福

在TextView控件里增加超链接文字的方法

介绍

介绍

福哥在更新app的时候发现手机商店上架app都需要设置“用户隐私协议”,说白了,就是在启动app的时候弹出一个对话框,告知用户我们的隐私政策,同意用户隐私协议才能继续使用app,否则需要强制退出app软件。

那么这里面的文字用的是TextView,里面的“协议”和“政策”都是需要链接到一个包含内容的网页地址上的,如何在TextView增加超链接呢?

SpannableString

要实现在TextView里设置超链接需要借助SpannableString这个对象,这个SpannableString可以在一段文字当中选择一部分文字设置它们的样式

初始化

初始化SpannableString对象

SpannableString spannableString;

spannableString = new SpannableString("福哥在公众号里教大家学习C/C++、Java、PHP语言编程哦");

设置下划线

选择一段文字,设置下划线

spannableString.setSpan(new UnderlineSpan(), 12, 17, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new UnderlineSpan(), 18, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new UnderlineSpan(), 23, 26, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

设置超链接

选择一段文字,增加超链接。其实这里说的超链接就是给这段文字增加了点击事件,然后在事件里打开网址

spannableString.setSpan(new ClickableSpan() {
    @Override
    public void onClick(@NonNull View widget) {
        Uri uri = Uri.parse("https://tongfu.net/home/35/tag/同福编程.html");
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(uri);
        startActivity(intent);
    }
}, 12, 17, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new ClickableSpan() {
    @Override
    public void onClick(@NonNull View widget) {
        Uri uri = Uri.parse("https://tongfu.net/home/35/tag/同福编程.html");
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(uri);
        startActivity(intent);
    }
}, 18, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new ClickableSpan() {
    @Override
    public void onClick(@NonNull View widget) {
        Uri uri = Uri.parse("https://tongfu.net/home/35/tag/同福编程.html");
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(uri);
        startActivity(intent);
    }
}, 23, 26, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

设置颜色

选择一段文字,设置字体颜色

spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#4e6ef2")), 12, 17, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#4e6ef2")), 18, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#4e6ef2")), 23, 26, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

绑定TextView

SpannableString设置好了之后,就可以设置到TextView里了,这里的GetSpannableString方法里就是上面设置SpannableString的逻辑

TextView textView;

textView = findViewById(R.id.desc);
textView.setText(GetSpannableString());
textView.setMovementMethod(LinkMovementMethod.getInstance());

链接去掉下划线

经过前面的设置后,我们的TextView里的C/C++、Java、PHP都会加上超链接了,不过你会发现每个超链接都有显示下划线,如果想去掉下划线怎么办?

可以在设置超链接时候重新updateDrawState方法,在里面去掉下划线

spannableString.setSpan(new ClickableSpan() {
    @Override
    public void onClick(@NonNull View widget) {
        Uri uri = Uri.parse("https://tongfu.net/home/35/tag/同福编程.html");
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.setData(uri);
        startActivity(intent);
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setUnderlineText(false);
    }
}, 12, 17, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);