【问题标题】:Android TextView HyperlinkAndroid TextView 超链接
【发布时间】:2016-12-13 06:31:22
【问题描述】:

我正在实现一个 TextView,其字符串包含两个超链接,如下所示,但链接没有打开新的浏览器窗口:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:textColor="#ffffff"
        android:paddingLeft="50dp"
        android:paddingRight="50dp"
        android:textSize="14sp"
        android:clickable="true"
        android:linksClickable="true"
        android:textColorLink="@color/colorPrimary"
        android:autoLink="web"
        android:text="@string/agree_terms_privacy"/>

在string.xml中

<string name="agree_terms_privacy">By continuing, you agree to our <a href="http://link1/terms">Terms of Use</a> and read the <a href="http://link1/privacy">Privacy Policy</a></string>

【问题讨论】:

标签: android hyperlink textview


【解决方案1】:

在查看了多个 Stack Overflow 帖子后,这是对我有用的解决方案。我已根据您的实施对其进行了定制:

1. 删除自动链接以支持使用 LinkMovementMethod,并将 linksClickable 设置为 true

<TextView
    android:id="@+id/termsOfUse"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center"
    android:textColor="#ffffff"
    android:paddingLeft="50dp"
    android:paddingRight="50dp"
    android:textSize="14sp"
    android:clickable="true"
    android:linksClickable="true"
    android:textColorLink="@color/colorPrimary"
    android:text="@string/agree_terms_privacy"/>

如果您使用 android:autoLink="web" 属性,那么您必须在 TextView 上调用 setText() 之前使用 textView.setAutoLinkMask(0); 覆盖它。如果您愿意,您还可以将链接设置为在您的活动中可点击,而不是像在 Harshal 的回答中那样,但我留下了它,因为您已经在布局中拥有它。我还在您的 TextView 中添加了一个名为 termsOfUse 的 ID,我们稍后将使用它。

2. 将strings.xml中的&lt;并去掉url周围的双引号

这是因为当您检索字符串资源时,它不会正确解析嵌入的 html,并且由于某种原因它不会转义双引号。所以而不是:

<string name="agree_terms_privacy">By continuing, you agree to our <a href="http://link1/terms">Terms of Use</a> and read the <a href="http://link1/privacy">Privacy Policy</a></string>

你会想要做的:

<string name="agree_terms_privacy">By continuing, you agree to our &lt;a href=http://link1/terms>Terms of Use&lt;/a> and read the &lt;a href=http://link1/privacy>Privacy Policy&lt;/a></string>

3.解析字符串资源并将其绑定到我们的TextView

Spanned policy = Html.fromHtml(getString(R.string.agree_terms_privacy));
TextView termsOfUse = (TextView)findViewById(R.id.termsOfUse);
termsOfUse.setText(policy);
termsOfUse.setMovementMethod(LinkMovementMethod.getInstance());

注意: Html.fromHtml 在 API 24 中已被弃用(请参阅 this post 了解有关如何在需要时处理此问题的更多信息)。我们使用此方法从字符串中获取预期的 HTML 格式。

【讨论】:

  • 谢谢,我为同一个用例尝试了多种解决方案(一个文本视图中的两个链接),这个确实有效!
  • 此解决方案适用于几个链接。重要提示 - 链接应从 http:// 或 https:// 开始
  • 找了半个小时终于找到了解决办法。谢谢+1
  • 这可以节省我的时间
  • 我错过了这一点:textView.setAutoLinkMask(0);这篇文章挽救了一天,谢谢!
【解决方案2】:

看看下面的代码sn-p,希望对你有帮助,

TextView textView =(TextView)findViewById(R.id.textView);
textView.setClickable(true);
textView.setMovementMethod(LinkMovementMethod.getInstance());
String text = "<a href='http://www.google.com'> Google </a>";
textView.setText(Html.fromHtml(text));

【讨论】:

  • 如何使该链接在 webview 中打开?
【解决方案3】:

这对我有用

在你的文本视图中添加这个:

android:autoLink="all"
android:clickable="true"

https://www.youtube.com/watch?v=UnJxyfyDyHU

希望对你有所帮助。

【讨论】:

    【解决方案4】:

    我建议您使用两个 TextViews,因为您需要两种不同的操作:

    TextView yourTermsOfUseTextView = (TextView) findViewById(R.id.your_id);
    yourTermsOfUseTextView.setOnclickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(your_download_link));
                        startActivity(myIntent);
                    }
                });
    

    重复隐私政策。

    【讨论】:

    • 如何在 OnClick 方法中仅从 textview 中获取链接?
    【解决方案5】:

    只需在您的 Textview

    中添加以下代码
    android:autoLink="email"   
    

    【讨论】:

      【解决方案6】:

      你可以像下面这样使用..

      1. 文本视图 xml

        <TextView
         android:id="@+id/tv_welcome_message"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"            
         android:textSize="16sp"/>
        
      2. 活动中

         TextView   tv_welcome_message=(TextView) findViewById(R.id.tv_welcome_message); 
         tv_welcome_message.setMovementMethod(LinkMovementMethod.getInstance());
         String text = " <a href='http://www.google.com'> Google </a>";
         tv_welcome_message.setText(Html.fromHtml(text));
        

      【讨论】:

        【解决方案7】:

        MainActivity.java

         TextView t2 = (TextView) findViewById(R.id.text2);
            t2.setMovementMethod(LinkMovementMethod.getInstance());
        

        我删除了 TextView 上的大部分属性以匹配演示中的内容

        <TextView
            android:id="@+id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/txtCredits"/>
        

        如果您正在调用 setMovementMethod(),请不要忘记删除 autoLink="web"

        【讨论】:

          【解决方案8】:

          只需使用Linkify

          textView.text = text
          Linkify.addLinks(textView, Linkify.WEB_URLS)
          

          【讨论】:

            猜你喜欢
            • 2015-08-30
            • 2012-03-06
            • 2020-09-13
            • 2012-03-13
            • 2020-10-17
            • 1970-01-01
            • 2012-07-09
            • 2011-06-29
            • 1970-01-01
            相关资源
            最近更新 更多