将 TextView 格式化为看起来像链接的样式
将 TextView 格式化为看起来像链接的样式
我已经成功使用 android:autoLink
来格式化链接等内容,但我需要使用 android:onClick
,所以在这种情况下无法使用它。我的原因是我发现,不小心点击电话号码太容易了,所以我要拦截点击事件并使用确认 Dialog
,然后才会拨号。
有没有简单的方法可以让我的 TextView
中的电话号码看起来像普通可点击的链接?我在 Android 源代码中搜索了一下,但找不到我要引用的特定样式。
admin 更改状态以发布 2023年5月21日
这是最简短的解决方案:
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);
可悲的是,单击效果并未出现为单击真实url链接,但您可以通过以下方式克服这个问题:
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; } });
另一种解决方案是使用Html.fromHtml(...),其中内部文本具有链接标签("")。
如果您希望获取其他解决方案,请查看此帖子。