Android: 使文本视图中的文本可点击

Android: Make text in textview clickable

我有一段文字,我希望在文本视图中可以点击这些文字。

我找到了这个评分很高的答案 here

文本元素在文本视图中看起来像链接,但不会触发点击功能。

我的XML:

<TextView
    android:id="@+id/mainTextView"
    android:layout_width="0dp"
    android:layout_height="193dp"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:clickable="true"
    android:enabled="false"
    android:linksClickable="true"
    android:text="@string/main_text"
    app:layout_constraintBottom_toTopOf="@+id/linearLayout2"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />

这是我的代码:

setTextViewHTML(lv_mainTextView, getResources().getString(R.string.main_text));
...
protected void makeLinkClickable(SpannableStringBuilder strBuilder, final URLSpan span)
{
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    ClickableSpan clickable = new ClickableSpan() {
        @Override
        public void onClick(View view) {
            // Do something with span.getURL() to handle the link click...
            Toast.makeText(getApplicationContext(), "Click", Toast.LENGTH_LONG).show();

        }
    };
    strBuilder.setSpan(clickable, start, end, flags);
    strBuilder.removeSpan(span);
}

protected void setTextViewHTML(TextView text, String html)
{
    CharSequence sequence = Html.fromHtml(html);
    SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
    URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
    for(URLSpan span : urls) {
        makeLinkClickable(strBuilder, span);
    }
    text.setText(strBuilder);
    text.setMovementMethod(LinkMovementMethod.getInstance());
}

当我调试它时,函数 "makeLinkClickable" 被调用,但从未触发 onCLick。

任何想法和帮助将不胜感激!!!

谢谢 Kev

已编辑:

我在资源中的文字看起来像这样:

"The &lt;a href="tree">tree</a> is larger than the &lt;a href="flower">flower</a>"

当使用 fromHTML 获取它时,它给了我以下字符串:

"The <a href="tree">tree</a> is larger than the <a href="flower">flower</a>"

您的代码是正确的。只需删除这一行:

android:enabled=false

也许这会对你有所帮助:

private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener) {
    SpannableString link = new SpannableString(text);
    link.setSpan(new ClickableString(listener), 0, text.length(),
            SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
    return link;
}

private void makeLinksFocusable(TextView tv) {
    MovementMethod m = tv.getMovementMethod();
    if ((m == null) || !(m instanceof LinkMovementMethod)) {
        if (tv.getLinksClickable()) {
            tv.setMovementMethod(LinkMovementMethod.getInstance());
        }
    }
}



 /*
* ClickableString class
 */
private static class ClickableString extends ClickableSpan {
    private View.OnClickListener mListener;

    public ClickableString(View.OnClickListener listener) {
        mListener = listener;
    }

    @Override
    public void onClick(View v) {
        mListener.onClick(v);
    }
}

示例:

private void spannableStringTEST()
{   

String text = "SOME TEXT! HELLO! YEA";
String text2 = "Some other text.";

        // Links
        SpannableString link = makeLinkSpan("YOUR CLICKABLE TEXT", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // respond to click
                  Toast.makeText(mContext, "IT WORKS", Toast.LENGTH_SHORT).show();
            //Intent intent = new Intent(Intent.ACTION_VIEW, "http://www.google.com");
            //context.startActivity(intent);
            }
        });
        TextView text = findViewByID(R.id.tv_cardView_text);
        text .setText(text);
        text .append(link);
        text .append(text2);


        makeLinksFocusable(text);

}

我的 xml 文本视图:

  <TextView
  android:id="@+id/tv_cardView_text"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"/>

希望你能用它做点什么!