2012-08-05 73 views
9

我一直在使用android:autoLink只是格式化鏈接等,但我需要使用,所以我不能在這種情況下使用。原因是我發現不小心點擊電話號碼太容易了,所以我要用確認Dialog來攔截點擊,然後再打電話。格式TextView看起來像鏈接

有沒有一種簡單的方法還是讓我TextView看起來像一個正常的可點擊的鏈接中的電話號碼?我探討了Android的源代碼,但找不到任何特定的樣式供我參考。

+0

一個解決辦法是延長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

回答

3
  • 您可以創建一個colors.xml資源文件,包含什麼顏色。請看看Colors
  • 如果你想要強調你的文字,那麼請看看這篇文章: Underline
  • 不要忘記添加android:clickable="true"setClickable(true)到 您TextViews讓他們點擊!
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); 

這應該工作。讓我知道你的進步。

+0

只是用字符串替換內容,然後只有你的代碼會正常工作。因爲內容不在這裏。 – 2014-06-24 09:23:04

+0

@RobiKumarTomar,謝謝!你是絕對正確的。 – yugidroid 2014-06-24 12:48:36

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()方法。明白我寫這個是爲了好玩,可能還有其他方法可以做到這一點,但我目前並不知道它們。希望這可以幫助!

+0

謝謝,這看起來非常好!我會盡快實施它,看看它是如何發展的。 :) – 2012-08-06 03:42:52

8

這是最短的解決方案:

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

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方法

相關問題