android getString(int resId,Object... formatArgs)方法中参数的样式文本

7eumitmz  于 2023-11-15  发布在  Android
关注(0)|答案(4)|浏览(118)

我有两个String资源:

<string name="give_us_feedback">Give us feedback at %1$s if you want to make the app even better!</string>  
<string name="email">[email protected]</string>

字符串
我想风格的电子邮件部分是蓝色和下划线,以表明用户可以点击它我知道使用SpannableString给文本上色,但是当我通过getString组合两个字符串时,它似乎不起作用(int resId,Object... formatArgs),大概是因为getString()将对发送的Object执行强制转换或.toString()。以下是不起作用的地方:

TextView emailTV = new TextView(this);
SpannableString email = new SpannableString(getString(R.string.email));
email.setSpan(new UnderlineSpan(), 0, email.length() - 1, 0);
email.setSpan(new ForegroundColorSpan(Color.BLUE), 0, email.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
String feedback = getString(R.string.give_us_feedback, email);
emailTV.setText(feedback);


有什么想法吗?

afdcj2ne

afdcj2ne1#

这有点棘手。转换回charsequence(String feedback = getString(R.string.give_us_feedback, email);)会使Spannable消失。试试这种方法(你想检查字符串中的正确索引)

String emailString = getString(R.string.email);
String feedback = getString(R.string.give_us_feedback, emailString);
SpannableString email = new SpannableString(feedback);
int startIndex = feedBack.indexOf(emailString);
int endIndex = startIndex + emailString.length();
email.setSpan(new UnderlineSpan(), startIndex, endIndex, 0);
email.setSpan(new ForegroundColorSpan(Color.BLUE), startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
emailTV.setText(email);

字符串

wz1wpwve

wz1wpwve2#

如果你的字符串已经包含了与参数相同的文本,那么上面的答案就不起作用了。
所以这就是我所做的(在Kotlin中)。我通过在字符串资源中搜索字面参数文本来获得参数的开始索引。这是使用正则表达式。

val text = getString(R.string.id)
val textWithArgs = getString(R.string.id, argument)

// Searches for the start index of %1$s
val startIndex = """%1${"\\$"}s""".toRegex().find(text)?.range?.start
val endIndex = startIndex?.plus(argument.length)

val styledText = if (startIndex == null || endIndex == null) {
    textWithArgs
} else {
    SpannableString(textWithArgs).apply {
        setSpan(
            ForegroundColorSpan(
                ContextCompat.getColor(
                    context,
                    R.color.id
                )
            ), startIndex, endIndex, 0
        )
    }
}

字符串

1hdlvixo

1hdlvixo3#

我写了一个方法来处理它。
isSearchForward是一个参数,用于切换是向前还是向后搜索字符串,因为这只会突出显示第一次出现的字符串。

private fun highlightKeywords(
    highlightColor: Int,
    message: String,
    keyword: String?,
    isSearchForward: Boolean? = true
): SpannableString {
    val spannableString = SpannableString(message)
    if (!keyword.isNullOrBlank()) {
        val startIndex = if (isSearchForward == true) {
            message.indexOf(keyword)
        } else {
            message.lastIndexOf(keyword)
        }
        val endIndex = startIndex + keyword.length

        spannableString.setSpan(UnderlineSpan(), startIndex, endIndex, 0)

        spannableString.setSpan(
            ForegroundColorSpan(highlightColor),
            startIndex,
            endIndex,
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        )
    }
    return spannableString
}

字符串

xghobddn

xghobddn4#

你可以使用我在here中的答案,所以你的代码应该是这样的:

val email:SpannableString 
... - prepare the email variable
val feedback = SpanFormatter.format(getString(R.string.give_us_feedbac),email)

字符串

相关问题