我有以下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。


当前回答

自动连接电话对我不起作用。下面的方法非常有效,

TextView tv = (TextView) findViewById(R.id.emergencynos);
String html2="<br><br>Fire - <b><a href=tel:997>997</a> </b></br></br>";
tv.append(Html.fromHtml(html2));
tv.setMovementMethod(LinkMovementMethod.getInstance());

其他回答

由于数据绑定是出来的,我想分享我的解决方案数据绑定TextViews支持HTML标签与可点击的链接。

为了避免检索每个textview并使用From.html为他们提供html支持,我们扩展了textview并将逻辑放在setText()中

public class HtmlTextView extends TextView {

    public HtmlTextView(Context context) {
        super(context);
    }

    public HtmlTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(Html.fromHtml(text.toString()), type);
        this.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

我已经做了一个主旨,也显示了使用这个实体和视图的例子。

对于那些从XML内容读取字符串和动态赋值有问题的人。

如果您正在使用来自strings.xml资源的文本,那么HTML标记似乎会被剥离。

所以你必须使用<![CDATA[**your string with click links**]]>在strings.xml文件中使用HTML . fromhtml (string)将其转换为HTML。

通过使用linkify:

Linkify获取一段文本和一个正则表达式,并将文本中的所有正则表达式匹配转换为可点击的链接:

TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("http://example.com");
Linkify.addLinks(textView, Linkify.WEB_URLS);

别忘了

import android.widget.TextView;

我希望这对你有帮助;

String value = "<html>Visit my blog <a href=\"http://www.maxartists.com\">mysite</a> View <a href=\"sherif-activity://myactivity?author=sherif&nick=king\">myactivity</a> callback</html>";
TextView text = (TextView) findViewById(R.id.text);

text.setText(Html.fromHtml(value));
text.setMovementMethod(LinkMovementMethod.getInstance());

[预棒棒糖测试以及棒棒糖及以上测试]

您可以从后端或资源文件中获取HTML字符串。 如果你把文本作为资源字符串,请确保添加CDATA标签:

<string name="your_text">![CDATA[...<a href="your_link">Link Title</a>  ...]]</string>

然后在代码中,你需要获取字符串并将其赋值为HTML,并设置一个链接移动方法:

String yourText = getString(R.string.your_text);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   textView.setText(Html.fromHtml(yourText, Html.FROM_HTML_MODE_COMPACT));
} else {
   textView.setText(Html.fromHtml(yourText));
}

try {
   subtext.setMovementMethod(LinkMovementMethod.getInstance());
} catch (Exception e) {
   //This code seems to crash in some Samsung devices.
   //You can handle this edge case base on your needs.
}