可点击 link 的 TextView 的一部分
Part of TextView clickable with a link
我有一个包含大量文本的应用程序 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:
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"/>
有什么想法吗?
在布局文件中制作 2 个文本视图,一个用于静态文本,另一个用于动态文本,并通过 textView.setText(dynamic text).. 分配动态文本。
希望对你有帮助..
测试前检查以下几点
- 检查您的 link 以
http://
或 https://
开头
- 将您的字符串放入 CDATA 标记中(如
<string name="some_text"><![CDATA[PLACE_YOUR_HTML_STRING_HERE]]></string>
)
- 检查您是否在
manifest.xml
文件中添加了互联网权限 <uses-permission android:name="android.permission.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());
你可以试试这个
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());
}
我有一个包含大量文本的应用程序 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:
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"/>
有什么想法吗?
在布局文件中制作 2 个文本视图,一个用于静态文本,另一个用于动态文本,并通过 textView.setText(dynamic text).. 分配动态文本。 希望对你有帮助..
测试前检查以下几点
- 检查您的 link 以
http://
或https://
开头
- 将您的字符串放入 CDATA 标记中(如
<string name="some_text"><![CDATA[PLACE_YOUR_HTML_STRING_HERE]]></string>
) - 检查您是否在
manifest.xml
文件中添加了互联网权限<uses-permission android:name="android.permission.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());
你可以试试这个
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());
}