将TextView格式化为链接

tre*_*r-e 12 android

我一直在使用android:autoLink正常的格式化链接等,但我需要使用android:onClick所以我不能在这种情况下使用它.原因是我发现不小心点击电话号码太容易了,所以我打算用确认拦截点击Dialog然后再打电话.

是否有一种简单的方法可以让我TextView看起来像普通的可点击链接?我探索了Android源代码,但找不到任何特定的风格供我参考.

and*_*per 10

这是最短的解决方案:

final CharSequence text = tv.getText();
final SpannableString spannableString = new SpannableString( text );
spannableString.setSpan(new URLSpan(""), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(spannableString, TextView.BufferType.SPANNABLE);
Run Code Online (Sandbox Code Playgroud)

遗憾的是,点击的效果并没有显示为点击真实的网址链接,但你可以像这样克服它:

    final CharSequence text = tv.getText();
    final SpannableString notClickedString = new SpannableString(text);
    notClickedString.setSpan(new URLSpan(""), 0, notClickedString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    tv.setText(notClickedString, TextView.BufferType.SPANNABLE);
    final SpannableString clickedString = new SpannableString(notClickedString);
    clickedString.setSpan(new BackgroundColorSpan(Color.GRAY), 0, notClickedString.length(),
            Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    tv.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(final View v, final MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                tv.setText(clickedString);
                break;
            case MotionEvent.ACTION_UP:
                tv.setText(notClickedString, TextView.BufferType.SPANNABLE);
                v.performClick();
                break;
            case MotionEvent.ACTION_CANCEL:
                tv.setText(notClickedString, TextView.BufferType.SPANNABLE);
                break;
            }
            return true;
        }
    });
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是使用Html.fromHtml(...),其中里面的文本有链接标记("").

如果您想要其他解决方案,请查看此帖子.


Bal*_*des 3

  • 您可以创建一个包含颜色的colors.xml 资源文件。请看一下颜色
  • 如果您想在文本下划线,请查看这篇文章: 下划线
  • 不要忘记添加android:clickable="true"setClickable(true)到您的 TextView 中以使它们可点击!