可通过链接单击的部分TextView

时间:2019-03-20 13:30:25

标签: android hyperlink textview

我有一个应用程序,它的strings.xml中包含很多文本。该文本的一部分是必须单击的超链接。

现在,当我从布局文件中将文本插入到TextView中时,它可以工作,但是当我尝试使用tv.settext(getStrings ...)将相同的文本插入到相同的TextView中时,将不起作用。

代码如下:

strings.xml:

<string name="some_text">
For you to see the article, you need to click <a href='http://www.google.com'>this link</a>
\n\n
after that etc...
</string>

活动:

TextView txt = findViewById(R.id.link_tv);
txt.setMovementMethod(LinkMovementMethod.getInstance());
txt.setText(getString(R.string.some_text));

activity_main.xml:

<TextView
     android:id="@+id/link_tv"
     android:textColor="@color/privacy_policy_link_text_color"
     android:paddingLeft="@dimen/_5sdp"
     android:paddingRight="@dimen/_5sdp"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"/>

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

在测试之前检查以下几点

  • 检查您的链接以http://还是https://
  • 将您的字符串放在CDATA标记中(例如<string name="some_text"><![CDATA[PLACE_YOUR_HTML_STRING_HERE]]></string>
  • 检查您是否已在manifest.xml文件<uses-permission android:name="android.permission.INTERNET"/>中添加了Internet权限
  • 然后可以使用以下代码将动态html文本设置为textView
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    textView.setText(Html.fromHtml(getString(R.string.html_string), Html.FROM_HTML_MODE_COMPACT));
} else { 
    textView.setText(Html.fromHtml(getString(R.string.html_string)));
}
Linkify.addLinks(textView, Linkify.ALL);
textView.setMovementMethod(LinkMovementMethod.getInstance());

答案 1 :(得分:0)

在布局文件中制作2个文本视图,一个用于静态文本,另一个用于动态文本,并通过textView.setText(dynamic text)分配动态文本。 希望对您有帮助。

答案 2 :(得分:0)

您可以尝试

   fun setClickableText(view: TextView, firstSpan: String, secondSpan: String) {
    val context = view.context
    val builder = SpannableStringBuilder()
    val unClickableSpan = SpannableString(firstSpan)
    val span = SpannableString(" "+secondSpan)

    builder.append(unClickableSpan);
    val clickableSpan: ClickableSpan = object : ClickableSpan() {
        override fun onClick(textView: View) {
           // ur action here
        }

        override fun updateDrawState(ds: TextPaint) {
            super.updateDrawState(ds)
            ds.isUnderlineText = true
            ds.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC));
        }
    }
    builder.append(span);
    builder.setSpan(clickableSpan, firstSpan.length, firstSpan.length+secondSpan.length+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

    view.setText(builder,TextView.BufferType.SPANNABLE)
    view.setMovementMethod(LinkMovementMethod.getInstance());


}