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

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

我需要调用另一个活动,将它与webView不离开应用程序。

重要笔记:

  • 改变textView的内容不是一个选项,我需要显示的链接,因为他们与他们有的计划,
  • textView中有很多文本,而不仅仅是链接。

我通过movementMethodIntentFilters ,可能会错过一些东西,但看起来不能帮助。

那么,有什么办法可以拦截TextView被触动的链接,而不是打开浏览器呢?

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

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

步骤1:创build自己的ClickableSpan的子类,在onClick()方法中执行所需的操作(例如,称为YourCustomClickableSpan

步骤2:将所有URLSpan对象批量转换为YourCustomClickableSpan对象。 我有一个这样的工具类:

 public class RichTextUtils { public static <A extends CharacterStyle, B extends CharacterStyle> Spannable replaceAll(Spanned original, Class<A> sourceType, SpanConverter<A, B> 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<A extends CharacterStyle, B extends CharacterStyle> { B convert(A span); } } 

你会这样使用它:

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

与一个自定义URLSpanConverter像这样:

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

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

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

  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. 定义将操纵TextView的Spanned文本的RichTextUtils Class

     public static class RichTextUtils { public static <A extends CharacterStyle, B extends CharacterStyle> Spannable replaceAll ( Spanned original, Class<A> sourceType, SpanConverter<A, B> 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<A extends CharacterStyle, B extends CharacterStyle> { B convert(A span, ClickSpan.OnClickListener listener); } } 
  3. 定义URLSpanConverter class ,它将使用您的自定义跨度执行replaceURLSpan的实际代码。

      public static class URLSpanConverter implements RichTextUtils.SpanConverter<URLSpan, ClickSpan> { @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类中,然后从任何地方轻松地引用它。

只是为了分享使用我刚创build的Textoo的替代解决scheme:

  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(); 

URLSpan这个库用自定义的ClickableSpan实现来replaceTextView中的URLSpan点击事件给用户提供的LinksHandler (s)。 该机制与@commonsWare的解决scheme非常相似。 只需将其封装在更高级别的API中即可使其更易于使用。

我认为大卫·赫德伦德(David Hedlund)对自己的回答就是要走的路。 在我的情况下,我有一个TextView包含用户的收件箱中的短信内容,我想处理下游的行为:

  1. 如果find了WEB URL,则将其链接起来,并在应用程序中处理点击。
  2. 如果findPHONE NUMBER(电话号码),则将其链接起来,并处理显示select器的点击,让用户select是否拨打该号码或将其添加到地址簿(全部在应用程序内)

为了达到这个目的,我以这种方式使用了链接的答案:

 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:"); 

现在在清单中:

 <activity android:name=".WebViewActivity" android:label="@string/web_view_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.web"/> </intent-filter> </activity> ... <activity android:name=".DialerActivity" android:label="@string/dialer_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <activity android:name=".AddressBook" android:label="@string/address_book_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> 

这对我来说很好,当用户点击一个电话号码时,select器将显示拨号器/地址簿选项。 在被调用的活动中,使用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); } }); 

WebActivity类的onCreate:

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

在XML文本视图下添加这个:

 android:clickable="true"