我一直使用android:autoLink
就可以很好地格式化链接等等,但是我需要使用android:onClick
所以我不能在这种情况下使用它。原因是我发现很容易意外点击电话号码,所以我要用确认Dialog
截取点击然后再打电话。
是否有一种简单的方法可以让TextView
中的电话号码看起来像普通的可点击链接?我探索了Android源代码,但找不到任何特定的风格供我参考。
答案 0 :(得分: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);
可悲的是,点击的效果并没有显示为点击真实的网址链接,但您可以像这样克服它:
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(...),其中里面的文本有链接标记(“”)。
如果您想要其他解决方案,请检查this post。
答案 1 :(得分:3)
答案 2 :(得分:3)
要为TextView的文本加下划线,您必须执行以下操作:
final TextView text = (TextView) findViewById(R.id.text);
SpannableString string = new SpannableString("This is the uderlined text.");
string.setSpan(new UnderlineSpan(), 0, string.length(), 0);
text.setText(string);
这应该有效。让我知道你的进展。
答案 3 :(得分:3)
Linkify是一个很棒的类,它可以搜索URL,电话号码等复杂模式,并将它们转换为URLSpans。我没有重写现有的正则表达式,而是扩展了URLSpan类,并创建了一个方法,通过确认对话框将仅电话URLSpans升级到自定义URLSpan。
首先我的扩展的URLSpan类,ConfirmSpan:
class ConfirmSpan extends URLSpan {
AlertDialog dialog;
View mView;
public ConfirmSpan(URLSpan span) {
super(span.getURL());
}
@Override
public void onClick(View widget) {
mView = widget;
if(dialog == null) {
AlertDialog.Builder mBuilder = new AlertDialog.Builder(widget.getContext());
mBuilder.setMessage("Do you want to call: " + getURL().substring(4) + "?");
mBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
})
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
openURL();
}
});
dialog = mBuilder.create();
}
dialog.show();
}
public void openURL() {
super.onClick(mView);
}
}
下一步换出不同范围类的方法:
private void swapSpans(TextView textView) {
Spannable spannable = (Spannable) textView.getText();
URLSpan[] spans = textView.getUrls();
for(URLSpan span : spans) {
if(span.getURL().toString().startsWith("tel:")) {
spannable.setSpan(new ConfirmSpan(span), spannable.getSpanStart(span), spannable.getSpanEnd(span), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.removeSpan(span);
}
}
}
最后您需要做的就是创建一个带有autoLink属性的TextView:
android:autoLink="phone"
请记得调用swapSpans()
方法。明白我写这篇文章是为了好玩,可能有其他方法可以做到这一点,但我现在还没有意识到它们。希望这有帮助!
答案 4 :(得分:0)
有更好的答案。这就是我所做的。
final SpannableString ss = new SpannableString("Click here to verify Benificiary");
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View textView) {
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
};
ss.setSpan(clickableSpan,0,ss.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(Color.BLUE);
当用户通过ClickableSpan的onclick方法点击链接时,您可以随心所欲。
答案 5 :(得分:0)
具有kotlin扩展功能(如果您不需要真实链接上的点击效果)
fun TextView.hyperlinkStyle() {
setText(
SpannableString(text).apply {
setSpan(
URLSpan(""),
0,
length,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
},
TextView.BufferType.SPANNABLE
)
}
使用方法
yourTextView.hyperlinkStyle()
答案 6 :(得分:0)
简单强调一下:
val myText = "Text to be underlined"
textView.text = Html.fromHtml("<u>$myText</u>")
或带有kotlin扩展名:
fun TextView.underline() {
text = Html.fromHtml("<u>${text}</u>")
}
用法:
textView.text = myText
textView.underline()
此处提供了更多在android中设置文字样式的方法:https://medium.com/androiddevelopers/spantastic-text-styling-with-spans-17b0c16b4568