使字符串可单击,在TextView中加下划线

Zba*_*ian 12 android hyperlink underline textview

在此输入图像描述

我想使字符串"this link"加下划线和可点击,但我不知道如何实现.

XML文件:

<string name="submitText">Before you submit, please check out &lt;u>this link&lt;/u></string>
Run Code Online (Sandbox Code Playgroud)

在我的片段中:

tvSubmit.setText(Html.fromHtml(getString(R.string.submitText)));
Run Code Online (Sandbox Code Playgroud)

我不希望整个字符串是可点击的,只有下划线部分.我不能使用LinearLayout2个单元格的水平,因为在较小的设备上,字符串不会有连续的外观,它将被分成2个单元格.

我试过了什么:

tvSubmit.setMovementMethod(LinkMovementMethod.getInstance());
Spannable sp = (Spannable) tvSubmit.getText();
ClickableSpan click = new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        showLink();
    }
};
sp.setSpan(click, 0, sp.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

上面的代码使整个字符串加下划线,并且文本的颜色也变为浅蓝色.

Bla*_*elt 10

问题是您将跨度设置为整个字符串(sp.setSpan(click, 0, sp.length()).要解决此问题,您只需将可点击范围设置为this link.我这样做了同样的事情:

<string name="submitText">Before you submit, please check out %1$s</string>
<string name="this_link">this link</string>
Run Code Online (Sandbox Code Playgroud)

在你的活动中

String thisLink = getString(R.string.thisLink);
String yourString = getString(R.string.submitText, thisLink);
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(yourString);
spannableStringBuilder.setSpan(click,
                startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)

其中startIndex和endIndex是thisLinkin 的索引yourString.我把这两个字符串分开了,因为它更容易查找索引,特别是如果你必须处理翻译.要计算你可以使用的startIndex yourString.indexOf(thisLink),endIndex是startIndex + the length of thisLink.我会留给你普通的支票,(负面指数和其他一切可能导致的IndexOutBoundException)