2012-08-05 55 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方法

相关问题