【问题标题】:Android: textview hyperlinkAndroid:文本视图超链接
【发布时间】:2012-04-08 18:42:26
【问题描述】:

我知道如果你把一个链接放在一个文本视图中它会起作用,但是如果我想显示例如:

谷歌 堆栈溢出

而不是整个链接(只是标签) 如何使这些链接可点击?

【问题讨论】:

标签: android hyperlink textview


【解决方案1】:

您可以有两个单独的 TextView,如果需要,您可以在布局中相应地对齐它们:

    Text1.setText(
        Html.fromHtml(
            "<a href=\"http://www.google.com\">google</a> "));
    Text1.setMovementMethod(LinkMovementMethod.getInstance());

    Text2.setText(
            Html.fromHtml(
                "<a href=\"http://www.stackoverflow.com\">stackoverflow</a> "));
    Text2.setMovementMethod(LinkMovementMethod.getInstance());

那么如果你想去掉“链接下划线”。创建一个类:

public class URLSpanNoUnderline extends URLSpan {
    public URLSpanNoUnderline(String url) {
        super(url);
    }
    @Override public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setUnderlineText(false);
        }
}

然后在拥有 TextViews 的主 Activity 类中添加此方法

private void stripUnderlines(TextView textView) {
    Spannable s = new SpannableString(textView.getText());
    URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
    for (URLSpan span: spans) {
        int start = s.getSpanStart(span);
        int end = s.getSpanEnd(span);
        s.removeSpan(span);
        span = new URLSpanNoUnderline(span.getURL());
        s.setSpan(span, start, end, 0);
    }
    textView.setText(s);
}

然后在初始化 TextViews(在你的 onCreate 中)之后调用它:

stripUnderlines(Text1);
stripUnderlines(Text2);

【讨论】:

  • 注意:如果您在 TextView 的属性中设置了自动链接某些属性,这将不起作用!如果有,则必须在调用 setText() 之前调用 textView.setAutoLinkMask(0);
  • 如果你需要翻译你的资源,我不推荐这个解决方案。
【解决方案2】:
TextView t2 = (TextView) findViewById(R.id.textviewidname);
t2.setMovementMethod(LinkMovementMethod.getInstance());

<string name="google_stackoverflow"><a href="https://stackoverflow.com/questions/9852184/android-textview-hyperlink?rq=1">google stack overflow</a></string>

链接是“Android: textview hyperlink

标签是“谷歌堆栈溢出”

在您的 java 中定义第一个代码块,在您的 strings.xml 文件中定义第二个代码块。另外,请务必从您的 java 页面布局中引用 textView 的 id。

【讨论】:

  • 我最喜欢你的方式。恕我直言,这是最干净的。
  • 这适用于多个链接。例如 示例:link1.com">Link1 和 link2.com">Link2
  • 也适用于数据绑定:只需为“containsLinks”之类的属性定义一个 BindingAdapter,然后在适配器中设置移动方法。
【解决方案3】:

android:autoLink="web" 如果您的 HTML 中有完整链接,则可以正常工作。以下内容将以蓝色突出显示并可点击:

【讨论】:

    【解决方案4】:

    非常简单的方法---

    在你的活动中--

     TextView tv = (TextView) findViewById(R.id.site);
     tv.setText(Html.fromHtml("<a href=http://www.stackoverflow.com> STACK OVERFLOW "));
     tv.setMovementMethod(LinkMovementMethod.getInstance());
    

    那么你将只得到标签,而不是整个链接..

    希望对你有帮助...

    【讨论】:

      【解决方案5】:

      这应该可以。

      TextView t2 = (TextView) findViewById(R.id.text2);
      t2.setMovementMethod(LinkMovementMethod.getInstance());
      
      and
      
      <TextView android:layout_width="wrap_content"
      android:layout_height="wrap_content" android:text="@string/txtCredits"
      android:id="@+id/text2"
       android:layout_centerInParent="true"
      android:layout_marginTop="20dp"></TextView>
      

      【讨论】:

      • 是的,为此您可以将其包含在您的字符串资源中 google.com">Google</a></string>.
      • 确保您没有在自动链接属性中选择任何内容。如果在自动链接属性中选择了任何内容 LinkMovementMethod.getInstance() 不适用于该文本视图
      【解决方案6】:

      这是我的工作实现

      private void showMessage()
          {
      
              lblMessage.setText("");
      
              List<String> messages = db.getAllGCMMessages();
      
              for (int k = messages.size() - 1; k >= 0; --k)
               {
      
                  String message  =  messages.get(k).toString();
                  lblMessage.append(message + "\n\n");
      
               }
           Linkify.addLinks(lblMessage, Linkify.ALL);
        }
      

      为了改变超链接的颜色,我为 textview 编辑了我的 xml -

       android:textColorLink="#69463d"
      

      【讨论】:

        【解决方案7】:

        数据绑定呢?

        @JvmStatic
        @BindingAdapter("textHtml")
        fun setHtml(textView: TextView, resource: String) {
            val html: Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Html.fromHtml(resource, Html.FROM_HTML_MODE_COMPACT)
            } else {
                Html.fromHtml(resource)
            }
        
            textView.movementMethod = LinkMovementMethod.getInstance()
            textView.text = html
        }
        

        字符串.xml

        <string name="text_with_link">&lt;a href=%2$s>%1$s&lt;/a> </string>
        

        在你的 layout.xml 中

                <TextView
                    android:id="@+id/title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:textHtml="@{@string/text_with_link(model.title, model.url)}"
                    tools:text="Some text" />
        

        xml 中的标题和链接是一个简单的字符串

        您还可以将多个参数传递给数据绑定适配器

        @JvmStatic
        @BindingAdapter(value = ["textLink", "link"], requireAll = true)
        fun setHtml(textView: TextView, textLink: String?, link: String?) {
            val resource = String.format(textView.context.getString(R.string.text_with_link, textLink, link))
        
            val html: Spanned = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Html.fromHtml(resource, Html.FROM_HTML_MODE_COMPACT)
            } else {
                Html.fromHtml(resource)
            }
        
            textView.movementMethod = LinkMovementMethod.getInstance()
            textView.text = html
        }
        

        并在 .xml 中分别传递参数

                <TextView
                    android:id="@+id/title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    app:link="@{model.url}"
                    app:textLink="@{model.title}"
                    tools:text="Some text" />
        

        【讨论】:

          【解决方案8】:

          我遇到了同样的问题,终于找到了可行的解决方案。

          1. 在string.xml文件中,定义:

            <string name="textWithHtml">The URL link is &lt;a href="http://www.google.com">Google&lt;/a></string>
            

          用 HTML 转义字符替换“

          1. 在 Java 代码中:

            String text = v.getContext().getString(R.string.textWithHtml);
            textView.setText(Html.fromHtml(text));
            textView.setMovementMethod(LinkMovementMethod.getInstance());
            

          TextBox 将正确显示带有可点击锚链接的文本

          【讨论】:

            【解决方案9】:

            使用

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:autoLink="web"
                android:text="www.google.com" />
            

            这个标志

            autolink="网络"

            控制是否自动找到url等链接并转换为可点击链接。默认值为“none”,禁用此功能。 值:全部、电子邮件、地图、无、电话、网络。

            【讨论】:

              猜你喜欢
              • 2011-08-24
              • 1970-01-01
              • 1970-01-01
              • 2021-01-19
              • 2016-07-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多