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

Android getString(int resId,Object…formatArgs)方法中参数的样式文本,android,string,textview,spannablestring,Android,String,Textview,Spannablestring,我有两个字符串资源: <string name="give_us_feedback">Give us feedback at %1$s if you want to make the app even better!</string> <string name="email">info@mycompany.com</string> 有什么想法吗?有点棘手。转换回charsequence(String feedback=getString(R.

我有两个字符串资源:

<string name="give_us_feedback">Give us feedback at %1$s if you want to make the app even better!</string>  
<string name="email">info@mycompany.com</string>

有什么想法吗?

有点棘手。转换回charsequence(
String feedback=getString(R.String.give\u us\u feedback,email);
)会使
Spannable
消失。尝试这种方法(您希望检查字符串中的正确索引)


我已经写了一个方法来处理它

isSearchForward
是一个参数,用于切换是向前还是向后搜索字符串,因为这只会突出显示第一次出现的字符串

private fun highlight关键字(
highlightColor:Int,
消息:String,
关键词:字符串?,
isSearchForward:布尔?=真
):SpannableString{
val spannableString=spannableString(消息)
如果(!keyword.isNullOrBlank()){
val startIndex=if(isSearchForward==true){
message.indexOf(关键字)
}否则{
message.lastIndexOf(关键字)
}
val endIndex=startIndex+keyword.length
spannableString.setSpan(下划线span(),起始索引,结束索引,0)
安装盘(
ForegroundColorSpan(highlightColor),
startIndex,
endIndex,
Spannable.SPAN_EXCLUSIVE\u EXCLUSIVE
)
}
回程吊环
}

如果字符串已包含与参数相同的文本,则上述答案无效

这就是我(在科特林)所做的。我通过在字符串资源中搜索文本参数文本来获取参数的开始索引。这与使用正则表达式有关

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