Android 文本视图的一部分,可通过链接单击

Android 文本视图的一部分,可通过链接单击,android,hyperlink,textview,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

我有一个应用程序,其中包含大量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>
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"/>


有什么想法吗?

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

在测试前检查以下要点

  • 检查以
    http://
    https://
    开头的链接
  • 将字符串放在CDATA标记中(如
  • 检查您是否已在
    manifest.xml
    文件
  • 然后,可以使用下面的代码在textView中动态设置html文本
你可以试试这个

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


}

你也可以发布你的TextView布局(XML)吗?另外,这可能就是你发布它的方式,但是你将TextView定义为txt,然后你使用tv只是为了确保你知道:)这就是我发布它的方式,TextView在项目中的调用方式不同。对我来说,同样的代码工作得非常好
txt.setMovementMethod(LinkMovementMethod.getInstance());if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){txt.setText(Html.fromHtml(getString(R.string.some_text),Html.FROM_Html_MODE_COMPACT));}else{txt.setText(Html.fromHtml(getString(R.string.some_text));}
您是否在xml中为textview设置了任何内容?我制作了一个只有一个textview的空应用程序以重试,但它不起作用。我不知道为什么…尝试一下,这应该可以工作
顺便说一句,这是您的全部努力。我所做的一切对您没有帮助,但为了其他用户的学习目的,我将编辑我的答案,谢谢s
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());
   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());


}