在另一个活动中打开TextView链接,而不是默认浏览器

Linkify.ALLautoLinkMask设置为Linkify.ALL ,我可以打开链接,浏览器显示网页。

我需要调用另一个活动来完成它的webView不会离开应用程序。

重要笔记:

  • 更改textView内容不是一个选项,我需要将链接显示为他们所拥有的方案,
  • textView中有很多文本,而不仅仅是链接。

我查看了IntentFiltersIntentFilters ,可能会错过一些东西,但看起来它IntentFilters

那么,任何拦截TextView被触摸的链接的选项都可以用它来打开浏览器吗?

如果你想提一下这个问题,请提出一些论据,为什么它似乎没有像我一样解决同样的问题。

步骤#1:创建自己的ClickableSpan子类,在其onClick()方法中执行您想要的操作(例如,名为YourCustomClickableSpan

步骤2:运行所有URLSpan对象的批量转换为YourCustomClickableSpan对象。 我有一个实用工具类:

 public class RichTextUtils { public static  Spannable replaceAll(Spanned original, Class sourceType, SpanConverter converter) { SpannableString result=new SpannableString(original); A[] spans=result.getSpans(0, result.length(), sourceType); for (A span : spans) { int start=result.getSpanStart(span); int end=result.getSpanEnd(span); int flags=result.getSpanFlags(span); result.removeSpan(span); result.setSpan(converter.convert(span), start, end, flags); } return(result); } public interface SpanConverter { B convert(A span); } } 

你会像这样使用它:

 yourTextView.setText(RichTextUtils.replaceAll((Spanned)yourTextView.getText(), URLSpan.class, new URLSpanConverter())); 

使用这样的自定义URLSpanConverter

 class URLSpanConverter implements RichTextUtils.SpanConverter { @Override public URLSpan convert(URLSpan span) { return(new YourCustomClickableSpan(span.getURL())); } } 

将所有URLSpan对象转换为YourCustomClickableSpan对象。

通过添加Click Listener,我可以使@CommonsWare的代码更加优雅和清晰,可以直接添加到替换URL Spans的相同方法中。

  1. 定义YourCustomClickableSpan Class

      public static class YourCustomClickableSpan extends ClickableSpan { private String url; private OnClickListener mListener; public YourCustomClickableSpan(String url, OnClickListener mListener) { this.url = url; this.mListener = mListener; } @Override public void onClick(View widget) { if (mListener != null) mListener.onClick(url); } public interface OnClickListener { void onClick(String url); } } 
  2. 定义RichTextUtils Class ,它将操作TextView的跨区文本。

     public static class RichTextUtils { public static  Spannable replaceAll ( Spanned original, Class sourceType, SpanConverter converter, final ClickSpan.OnClickListener listener) { SpannableString result = new SpannableString(original); A[] spans = result.getSpans(0, result.length(), sourceType); for (A span : spans) { int start = result.getSpanStart(span); int end = result.getSpanEnd(span); int flags = result.getSpanFlags(span); result.removeSpan(span); result.setSpan(converter.convert(span, listener), start, end, flags); } return (result); } public interface SpanConverter { B convert(A span, ClickSpan.OnClickListener listener); } } 
  3. 定义URLSpanConverter class ,它将使用您的自定义跨度执行替换URLSpan的实际代码。

      public static class URLSpanConverter implements RichTextUtils.SpanConverter { @Override public ClickSpan convert(URLSpan span, ClickSpan.OnClickListener listener) { return (new ClickSpan(span.getURL(), listener)); } } 
  4. 用法

     TextView textView = ((TextView) this.findViewById(R.id.your_id)); textView.setText("your_text"); Linkify.addLinks(contentView, Linkify.ALL); Spannable formattedContent = UIUtils.RichTextUtils.replaceAll((Spanned)textView.getText(), URLSpan.class, new UIUtils.URLSpanConverter(), new UIUtils.ClickSpan.OnClickListener() { @Override public void onClick(String url) { // Call here your Activity } }); textView.setText(formattedContent); 

请注意,我在这里将所有类定义为静态,因此您可以直接将它放在Util类中,然后从任何地方轻松引用它。

只是为了使用我刚刚创建的Textoo共享替代解决方案:

  TextView yourTextView = Textoo .config((TextView) findViewById(R.id.your_text_view)) .addLinksHandler(new LinksHandler() { @Override public boolean onClick(View view, String url) { if (showInMyWebView(url)) { // // Your custom handling here // return true; // event handled } else { return false; // continue default processing ie launch browser app to display link } } }) .apply(); 

在引擎盖下,库使用自定义ClickableSpan实现替换TextView中的URLSpan ,该实现将点击事件分派给用户提供的LinksHandler 。 该机制与@commonsWare的解决方案非常相似。 只需打包更高级别的API即可使其更易于使用。

我认为David Hedlund对自己的回答是要走的路。 在我的情况下,我有一个TextView包含用户收件箱的短信内容,我想处理以下行为:

  1. 如果find了WEB URL,则将其链接并处理应用程序中的单击。
  2. 如果findPHONE NUMBER,则将其链接并处理显示选择器的点击,让用户选择是否拨打该号码或将其添加到地址簿(所有应用内)

为此,我以这种方式使用了链接的答案:

 TextView tvBody = (TextView)findViewById(R.id.tvBody); tvBody.setText(messageContentString); // now linkify it with patterns and scheme Linkify.addLinks(tvBody, Patterns.WEB_URL, "com.my.package.web:"); Linkify.addLinks(tvBody, Patterns.PHONE, "com.my.package.tel:"); 

现在在清单中:

        ...               

它对我来说很好用,当用户点击电话号码时,选择器将显示拨号器/地址簿选项。 在被调用的活动中,使用getIntent().getData()来查找传递的Url及其中的数据。

比这样做:

  TextView textView=(TextView) findViewById(R.id.link); textView.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent=new Intent(YourActivityName.this,WebActivity.class); startActivity(intent); } }); 

onWebrectivity类的创建:

 WebView webView=(WebView) findViewById(R.id.web); webView.loadUrl("http://www.google.co.in"); 

在xml中的textview下添加:

 android:clickable="true"