我一直在使用android:autoLink
只是格式化鏈接等,但我需要使用,所以我不能在這種情況下使用。原因是我發現不小心點擊電話號碼太容易了,所以我要用確認Dialog
來攔截點擊,然後再打電話。格式TextView看起來像鏈接
有沒有一種簡單的方法還是讓我TextView
看起來像一個正常的可點擊的鏈接中的電話號碼?我探討了Android的源代碼,但找不到任何特定的樣式供我參考。
我一直在使用android:autoLink
只是格式化鏈接等,但我需要使用,所以我不能在這種情況下使用。原因是我發現不小心點擊電話號碼太容易了,所以我要用確認Dialog
來攔截點擊,然後再打電話。格式TextView看起來像鏈接
有沒有一種簡單的方法還是讓我TextView
看起來像一個正常的可點擊的鏈接中的電話號碼?我探討了Android的源代碼,但找不到任何特定的樣式供我參考。
爲了強調你的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);
這應該工作。讓我知道你的進步。
只是用字符串替換內容,然後只有你的代碼會正常工作。因爲內容不在這裏。 – 2014-06-24 09:23:04
@RobiKumarTomar,謝謝!你是絕對正確的。 – yugidroid 2014-06-24 12:48:36
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()
方法。明白我寫這個是爲了好玩,可能還有其他方法可以做到這一點,但我目前並不知道它們。希望這可以幫助!
謝謝,這看起來非常好!我會盡快實施它,看看它是如何發展的。 :) – 2012-08-06 03:42:52
這是最短的解決方案:
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(...),裏面的文本有鏈接標籤(「」)。
如果你想另一種解決方案,檢查this post。
有一個更好的答案。這就是我所做的。
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方法
一個解決辦法是延長ClickableSpan做點擊鏈接的自定義的處理:HTTP:/ /developer.android.com/reference/android/text/style/ClickableSpan.html也檢查此線程: http://stackoverflow.com/questions/11413399/open-textview-links-at-another-activity-not-默認瀏覽器 – almalkawi 2012-08-05 22:28:49