【问题标题】:Part of TextView clickable with a link部分 TextView 可通过链接点击
【发布时间】:2019-08-11 05:08:54
【问题描述】:

我有一个应用程序,其中包含很多位于 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"/>

有什么想法吗?

【问题讨论】:

  • 你能把你的 TextView 布局 (XML) 也发布一下吗?
  • 另外,这可能只是您发布它的方式,但是您将 TextView 定义为 txt 但随后您使用 tv 只是确保你知道:)
  • 就是我贴的方式,TextView在项目中的调用方式不同。

标签: android hyperlink textview


【解决方案1】:

在测试前检查以下几点

  • 检查您的链接是否以http://https:// 开头
  • 将您的字符串放在 CDATA 标记中(如 &lt;string name="some_text"&gt;&lt;![CDATA[PLACE_YOUR_HTML_STRING_HERE]]&gt;&lt;/string&gt;
  • 检查您是否在manifest.xml 文件&lt;uses-permission android:name="android.permission.INTERNET"/&gt; 中添加了互联网权限
  • 然后可以使用下面的代码将动态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());

【讨论】:

  • 对我来说,同样的代码运行良好txt.setMovementMethod(LinkMovementMethod.getInstance()); if (Build.VERSION.SDK_INT &gt;= 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))); }screenshot
  • 你在 xml 中为 textview 设置了什么吗?
  • 我制作了一个只有一个 TextView 的空应用程序,再次尝试它,但它不工作。我不知道为什么...
  • 试试这个,应该可以的&lt;string name="some_text"&gt;&lt;![CDATA[For you to see the article, you need to click &lt;a href="google.com"&gt;THIS LINK&lt;/a&gt; after that etc...]]&gt;&lt;/string&gt;
  • 干得好,你所有的努力我都没有做任何对你有帮助的事情,但为了其他用户的学习目的,我会编辑我的答案,谢谢
【解决方案2】:

你可以试试这个

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


}

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多