【问题标题】:How to make a textview text link clickable如何使文本视图文本链接可点击
【发布时间】:2017-04-11 15:10:27
【问题描述】:
Android Studio 2.3.1

我正在尝试创建一些不是 web 或 html 的文本,而只是一些普通的文本,我希望它们看起来像一个 web 链接,点击时可以点击。

文字是这样的:Contains 3 reviews

我想让它看起来像一个可点击的网络链接。

private void setupTextViewAsLinkClickable() {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        mTvReviews.setMovementMethod(LinkMovementMethod.getInstance());
        mTvReviews.setText(Html.fromHtml("Contains 3 reviews", Html.FROM_HTML_MODE_LEGACY));
    }
    else {
        mTvReviews.setMovementMethod(LinkMovementMethod.getInstance());
        mTvReviews.setText(Html.fromHtml("Contains 3 reviews"));
    }
}

我也为我的 xml 尝试过这个:

        <TextView
            android:id="@+id/tvReviews"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fontFamily="sans-serif-condensed"
            android:autoLink="all"
            android:linksClickable="true"
            android:clickable="true"
            android:textSize="@dimen/runtime_textsize"
            android:text="Contains 3 reviews" />

【问题讨论】:

    标签: android textview


    【解决方案1】:
    • 如果您的 HTML 中有完整链接,android:autoLink="web" 可以工作。以下内容将以蓝色突出显示并可点击:
    • 一些文字&lt;a href="http://www.google.com"&gt;http://www.google.com&lt;/a&gt;
    • 一些文字http://www.google.com
    • view.setMovementMethod(LinkMovementMethod.getInstance()); 将与以下内容一起使用(将突出显示并可点击):
    • 一些文字&lt;a href="http://www.google.com"&gt;http://www.google.com&lt;/a&gt;
    • 一些文字http://www.google.com
    • 一些文字&lt;a href="http://www.google.com"&gt;Go to Google&lt;/a&gt;

    注意第三个选项有一个超链接,但是链接的描述(标签之间的部分)本身并不是一个链接。 android:autoLink="web" 确实使用此类链接。

    • android:autoLink="web" 如果在 XML 中设置将覆盖 view.setMovementMethod(LinkMovementMethod.getInstance());(即;第三种链接将突出显示,但不可点击)。

    故事的寓意是在您的代码中使用view.setMovementMethod(LinkMovementMethod.getInstance());,如果您希望所有链接都可点击,请确保您的XML 布局中没有android:autoLink="web"

    【讨论】:

      【解决方案2】:

      试试这个代码,它在我的项目中的工作代码。

      SpannableString ss = new SpannableString("Android is a Software stack");
      ClickableSpan clickableSpan = new ClickableSpan() {
          @Override
          public void onClick(View textView) {
              startActivity(new Intent(MyActivity.this, NextActivity.class));
          }
          @Override
          public void updateDrawState(TextPaint ds) {
                  super.updateDrawState(ds);
                  ds.setUnderlineText(false);
              }
      };
      ss.setSpan(clickableSpan, 22, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
      
      TextView textView = (TextView) findViewById(R.id.hello);
      textView.setText(ss);
      textView.setMovementMethod(LinkMovementMethod.getInstance());
      textView.setHighlightColor(Color.TRANSPARENT);
      

      How to set the part of the text view is clickable

      【讨论】:

        【解决方案3】:

        你可以使用这个类来使文本视图看起来像 web url,甚至可以点击

        public final class LinkUtils {
            public static final Pattern URL_PATTERN =
                    Pattern.compile("((https?|ftp)(:\\/\\/[-_.!~*\\'()a-zA-Z0-9;\\/?:\\@&=+\\$,%#]+))");
        
            public interface OnClickListener {
                void onLinkClicked(final String link);
        
                void onClicked();
            }
        
            static class SensibleUrlSpan extends URLSpan {
                /**
                 * Pattern to match.
                 */
                private Pattern mPattern;
        
                public SensibleUrlSpan(String url, Pattern pattern) {
                    super(url);
                    mPattern = pattern;
                }
        
                public boolean onClickSpan(View widget) {
                    boolean matched = mPattern.matcher(getURL()).matches();
                    if (matched) {
                        super.onClick(widget);
                    }
                    return matched;
                }
            }
        
            static class SensibleLinkMovementMethod extends LinkMovementMethod {
        
                private boolean mLinkClicked;
        
                private String mClickedLink;
        
                @Override
                public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
                    int action = event.getAction();
        
                    if (action == MotionEvent.ACTION_UP) {
                        mLinkClicked = false;
                        mClickedLink = null;
                        int x = (int) event.getX();
                        int y = (int) event.getY();
        
                        x -= widget.getTotalPaddingLeft();
                        y -= widget.getTotalPaddingTop();
        
                        x += widget.getScrollX();
                        y += widget.getScrollY();
        
                        Layout layout = widget.getLayout();
                        int line = layout.getLineForVertical(y);
                        int off = layout.getOffsetForHorizontal(line, x);
        
                        ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
        
                        if (link.length != 0) {
                            SensibleUrlSpan span = (SensibleUrlSpan) link[0];
                            mLinkClicked = span.onClickSpan(widget);
                            mClickedLink = span.getURL();
                            return mLinkClicked;
                        }
                    }
                    super.onTouchEvent(widget, buffer, event);
        
                    return false;
                }
        
                public boolean isLinkClicked() {
                    return mLinkClicked;
                }
        
                public String getClickedLink() {
                    return mClickedLink;
                }
        
            }
        
            public static void autoLink(final TextView view, final OnClickListener listener) {
                autoLink(view, listener, null);
            }
        
            public static void autoLink(final TextView view, final OnClickListener listener,
                                        final String patternStr) {
                String text = view.getText().toString();
                if (TextUtils.isEmpty(text)) {
                    return;
                }
                Spannable spannable = new SpannableString(text);
        
                Pattern pattern;
                if (TextUtils.isEmpty(patternStr)) {
                    pattern = URL_PATTERN;
                } else {
                    pattern = Pattern.compile(patternStr);
                }
                Matcher matcher = pattern.matcher(text);
                while (matcher.find()) {
                    SensibleUrlSpan urlSpan = new SensibleUrlSpan(matcher.group(1), pattern);
                    spannable.setSpan(urlSpan, matcher.start(1), matcher.end(1),
                            Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                }
                view.setText(spannable, TextView.BufferType.SPANNABLE);
        
                final SensibleLinkMovementMethod method = new SensibleLinkMovementMethod();
                view.setMovementMethod(method);
                if (listener != null) {
                    view.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (method.isLinkClicked()) {
                                listener.onLinkClicked(method.getClickedLink());
                            } else {
                                listener.onClicked();
                            }
                        }
                    });
                }
            }
        }
        

        在活动调用中

        String testStr = "Text 。http://www.yahoo.com , Text ";
        
        textView1.setTextSize(20);
        textView1.setText(testStr);
        
        LinkUtils.autoLink(textView1, new LinkUtils.OnClickListener() {
            @Override
            public void onLinkClicked(final String link) {
                            Log.i("Log", "Log"+link);
            }
        
            @Override
            public void onClicked() {
                Log.i("Log", "Log");
            }
        });
        

        【讨论】:

        • 我尝试了第二个。而且文字看起来很正常。
        • 当您想单击 textview 并执行操作时,这将是解决方案,如果您正在寻找它,请告诉我
        • 是的,我想点击textview并打开一个DialogFragment。
        猜你喜欢
        • 1970-01-01
        • 2015-07-31
        • 2016-12-12
        • 2022-07-28
        • 1970-01-01
        • 2018-09-14
        • 2013-07-26
        • 1970-01-01
        • 2017-02-01
        相关资源
        最近更新 更多