安卓TextView超链接

29

我正在实现一个包含两个超链接的字符串的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>

3
你有没有查看过 https://dev59.com/6nE85IYBdhLWcg3whT5r ? - Siarhei
请查看答案:https://dev59.com/6nE85IYBdhLWcg3whT5r#2746708 - Sujay
我建议熟悉Spannable。https://dev59.com/XGgv5IYBdhLWcg3wTvE-. - piotrpo
如果我的回答对您有所帮助,您是否愿意将其标记为已接受的答案呢? - nymeria
9个回答

40

这是我在查看多个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中已被弃用(有关如何处理此问题,请参见此帖子)。我们使用这种方法从字符串中获取所期望的HTML格式。


3
谢谢,我尝试了多种解决方案来实现同一用例(在单个文本视图中显示两个链接),这个确实有效! - passatgt
1
这个解决方案适用于一些链接。重要提示 - 链接应该以http://或https://开头。 - ViT-Vetal-
1
在搜索了半个小时后终于找到了解决方案。谢谢 +1 - amit pandya
1
这个救了我的一天。 - Yohanim
1
我错过了这一部分:textView.setAutoLinkMask(0); 这篇文章救了我的一天,谢谢! - dev2505

15

请看下面的代码片段,希望它能帮到你,

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中打开? - Sindhu Arju

8

2

我建议您使用两个 TextView,因为您需要执行两个不同的操作:

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中的链接? - Sindhu Arju

1
在你的中添加下面的代码。
android:autoLink="email"   

1
你可以像下面这样使用:

您可以像下面这样使用。

  1. textview xml

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

     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));
    

0

只需使用Linkify

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

0
这对我很有效 在你的textview中添加这个
android:linksClickable="true"
android:autoLink="all"

自动链接值: 所有, 电子邮件, 地图, 无, 电话, 网站。控制是否自动查找并将诸如网址和电子邮件地址转换为可点击的链接。默认值为“无”,禁用此功能。


0

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"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接