如何使textview文本链接可单击

时间:2017-04-11 15:10:28

标签: android textview

Android Studio 2.3.1

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

案文如下: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" />

3 个答案:

答案 0 :(得分:8)

    如果您的HTML中包含完整链接,则
  • android:autoLink="web"有效。以下内容将以蓝色突出显示并可单击:
  
      
  • 一些文字<a href="http://www.google.com">http://www.google.com</a>
  •   
  • 一些文字http://www.google.com
  •   
  • view.setMovementMethod(LinkMovementMethod.getInstance());将使用以下内容(将突出显示并可点击):
  
      
  • 一些文字<a href="http://www.google.com">http://www.google.com</a>
  •   
  • 一些文字http://www.google.com
  •   
  • 一些文字<a href="http://www.google.com">Go to Google</a>
  •   

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

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

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

答案 1 :(得分:7)

尝试使用此代码,在我的项目中使用其工作代码。

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

答案 2 :(得分:2)

您可以使用此类使textview看起来像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");
    }
});