我有以下TextView定义:

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="@string/txtCredits"
    android:autoLink="web" android:id="@+id/infoTxtCredits"
    android:layout_centerInParent="true"
    android:linksClickable="true"/>

其中@string/txtCredits是一个字符串资源,包含<a href="some site">链接文本</a>。

Android正在突出显示TextView中的链接,但它们不响应单击。我做错了什么?我必须在我的活动中为TextView设置一个onClickListener像这样简单吗?

它看起来和我定义字符串资源的方式有关。

这行不通:

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>

但这确实是:

<string name="txtCredits">www.google.com</string>

这是一个遗憾,因为我宁愿显示一个文本链接,而不是显示完整的URL。


当前回答

你只需要这样做:

android:autoLink="web"

插入这一行到一个TextView,可以点击与web的引用。URL被设置为这个TextView的文本。

例子:

 <TextView
    android:id="@+id/textViewWikiURL"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:textStyle="bold"
    android:text="http://www.wikipedia.org/"
    android:autoLink="web" />

其他回答

我注意到使用android:autoLink="web"因此

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:autoLink="web"/>

对于url来说工作得很好,但是因为我有一个电子邮件地址和电话号码,我想要链接,我最终使用这一行android:autoLink="all"像这样

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:autoLink="all"/>

而且效果很好。

上面的解决方案对我没用,但是下面的解决方案对我有用(而且看起来更简洁)。 首先,在字符串资源中,使用HTML实体编码定义标签开头的v形符号,即:

&lt;a href="http://www.google.com">Google&lt;/a>

而不是:

<a href="http://www.google.com">Google</a>

一般来说,像这样编码字符串中的所有v形符号。顺便说一下,链接必须以http://开头

然后(正如这里所建议的)在你的TextView上设置这个选项:

 android:linksClickable="true"

最后,在代码中,执行以下操作:

((TextView) findViewById(R.id.your_text_view)).setMovementMethod(LinkMovementMethod.getInstance());
((TextView) findViewById(R.id.your_text_view)).setText(Html.fromHtml(getResources().getString(R.string.string_with_links)));

就是这样。不需要正则表达式或其他手工操作。

以下内容应该适用于在Android应用程序中寻找文本和超链接组合的任何人。

在string.xml:

<string name="applink">Looking for Digital Visiting card? 
<a href="https://play.google.com/store/apps/details?id=com.themarkwebs.govcard">Get it here</a>
</string>

现在你可以在任何给定的视图中使用这个字符串,就像这样:

<TextView
    android:id="@+id/getapp"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center"
    android:textColor="@color/main_color_grey_600"
    android:textSize="15sp"
    android:text="@string/applink"/>

现在,在您的活动或片段中,执行以下操作:

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

到目前为止,你不需要设置android:autoLink="web"或android:linksClickable="true"使用这种方法。

我并不是要把它打得死死的,但下面是在Linkfy等人的被窝里发生的事情。您将注意到setText()接受CharSequence。Linkify等将字符串转换为span,并添加span。Spannable间接继承CharSequence,就像String一样,所以它与setText()一起工作。使用Spannables,你可以混合和匹配跨度,做各种有趣的事情。这里有一个简单的例子。

val textView = findViewById<TextView>(R.id.myTextView)
val span = SpannableStringBuilder(getString(R.string.linkText))
textView [0, textView .length] = URLSpan("https://myWebiste.com/")
textView.text = span
textView.movementMethod = LinkMovementMethod.getInstance()

需要注意的是,Kotlin语法非常流畅,但它混淆了Spannable.setSpan()调用,这就是魔术发生的地方。

我只使用android:autoLink=“web”,它工作得很好。单击该链接将打开浏览器并显示正确的页面。

我能猜到的一件事是,其他一些视图在链接的上方。透明的内容填充整个父元素,但不显示链接上方的任何内容。在这种情况下,点击指向这个视图而不是链接。