当前位置: 首页 > 知识库问答 >
问题:

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

姜聪
2023-03-14

将带有autoLinkMask的文本视图设置为Linkify。所有的,我可以打开链接,浏览器显示网页。

我需要调用另一个活动,该活动将使用其webView进行操作,而不是离开应用程序。

重要提示:

  • 更改文本视图内容不是一个选项,我需要让链接与它们的方案保持一致,
  • 文本视图中有很多文本,不仅仅是链接

我查看了movementMethodIntentFilters,可能遗漏了一些内容,但看起来似乎没什么帮助。

那么,在TextView中拦截触摸链接的任何选项都可以在不打开浏览器的情况下进行操作吗?

如果你想提到这个SO问题,请给出一些论点,为什么它似乎不能解决和我一样的问题。

共有3个答案

刁远
2023-03-14

只是为了分享一个使用我刚刚创建的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 i.e. launch browser app to display link
                }
            }
        })
        .apply();

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

丁阳炎
2023-03-14

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

>

  • 定义您的自定义可点击span 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);
        }
    }
    

    定义RichTextUtils类,该类将操作TextView的跨文本。

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

    定义URLSpanConverter类,该类将用自定义Span替换URLSpan的实际代码。

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

    用法

    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类,然后从任何地方轻松引用它。

  • 胡元忠
    2023-03-14

    步骤#1:创建您自己的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对象。

     类似资料:
    • 我有以下场景:安装了firefox和chrome的Ubuntu16.04机器,chrome是我的默认浏览器。 我在shell中检查以下操作: 并且不会出现firefox的任何一面,总是Chrome。这样很好。还要检查: 点击桌面文件。html->chrome启动 现在奇怪的是,如果我跑了: 出于某种奇怪的原因,它总是打开Firefox。我不知道为什么,有人能帮我吗?

    • 我有一个非常简单的测试应用程序,上面有一个webview组件。我正试图阻止链接在浏览器中打开,但“shouldoverrideurlloading”看起来对我不起作用。 有人能帮我看看哪里有错误吗?

    • 我最近实现了shouldInterceptRequest方法来检测链接的时间“http://sitemercado.com.br/valida“点击在android浏览器中打开它,而不是在webview中内部打开,直到它工作为止。链接在浏览器中打开,但当我回来查看webview应用程序时,它也被加载了,我希望它只在浏览器中加载。 我的代码如下: 我哪里做错了?

    • 问题内容: 是否有任何(简单/内置方式)打开新浏览器(我的意思是默认的OS浏览器)窗口来查找Electron链接的方法,而不是访问您Electron应用程序中的链接? 问题答案: 您可以简单地使用:

    • 问题内容: 我正在使用BrowserWindow来显示应用程序,并且我想强制在默认浏览器中打开外部链接。这是否有可能,或者我必须以不同的方式来对待? 问题答案: 在检查上一个答案的解决方案后,我想到了这一点。 根据电子规格,单击外部链接时会触发。 注意:要求您在锚标记上使用。

    • 问题内容: 我正在用Python开发一个小项目。它分为两个部分。 第一部分负责爬网并提取一些信息并将其插入数据库。 第二部分负责使用数据库来呈现那些信息。这两部分共享数据库。在第二部分中,我使用Flask框架以一些格式,样式等将信息显示为html,以使其看起来更整洁。 这两部分的源文件都在同一个程序包中,但是要正确运行此程序,用户必须像这样分别运行搜寻器和结果表示器: python crawler