【问题标题】:TextView with custom links带有自定义链接的 TextView
【发布时间】:2018-02-11 22:48:01
【问题描述】:

是否有一种简单的方法可以为 Android TextView 组件创建自定义链接并处理它们的“触摸”行为?

我在网上没有找到任何解决方案,但我自己的。

【问题讨论】:

  • linkify 能解决您的问题吗?
  • 在 Linkify 的情况下,您必须实现自己的模式,但您仍需要覆盖 Linkmovement 方法或编写自己的方法以响应触摸事件。下面的方法使用了框架的Html wrapper,我觉得还是挺方便的。

标签: android hyperlink textview linkmovementmethod


【解决方案1】:

有一种简单的方法可以为 textview 创建自定义链接并根据触摸事件处理它们的行为。 为了避免编写和编写自己的模式包装器,使用了 Html 包装器。

    TextView tView = ((TextView)v.findViewById(R.id.otp_activation_notification));
    Spanned ssBuilder =  Html.fromHtml("Not a link <a href=\"foo://haha/arg1/arg2?q1=1&q2=2\">The first link</a> bla bla "
    + " <a href=\"foo://haha2?q3=3\">The second link</a>");
    tView.setText(ssBuilder);
    tView.setMovementMethod(new LinkMovementMethod(){

        @Override
        public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
            //TODO: In order to override the links actions
            int x = (int) event.getX();
            int y = (int) event.getY();

            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);

            try {
                URLSpan[] urlSpans = buffer.getSpans(off, off, URLSpan.class);
                if (urlSpans != null && urlSpans.length > 0) {
                    Uri uri = Uri.parse(urlSpans[0].getURL());
                    String scheme = uri.getScheme();
                    if ("foo".equals(scheme)) {
                        String command = uri.getAuthority();
                        if ("haha".equals(command)) {
                            List<String> arguments = uri.getPathSegments();
                            String q1 = uri.getQueryParameter("q1");
                            String q2 = uri.getQueryParameter("q2");
                            //TODO: Execute command (pay attention for MotionEvent)
                            return true;
                        } else if ("haha2".equals(command)) {
                            String q3 = uri.getQueryParameter("q2");
                            //TODO: Execute command2 (pay attention for MotionEvent)
                            return true;
                        }
                        return false;
                    }
                }
            } catch (Exception e) {
                //Log: unable to parse link;
            }
            //return false in case you don't want to use default behavior.
            return super.onTouchEvent(widget, buffer, event);

        }
    });

【讨论】:

    猜你喜欢
    • 2015-11-24
    • 2022-09-27
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    相关资源
    最近更新 更多