我正在尝试在警报对话框中为文本设置 2 种不同的颜色,通过可跨度但不幸的是所有文本都保持白色。字符串"消息"应为绿色,字符串"消息 2"应为正常白色。
如果我删除下面行中的第二个字符串消息2,一切都是应该的。
.setMessage(ssBuilder + message2)
对话框的代码:
public static AlertDialog createDarkDialog(Context context, String title, String message, String message2) {
ContextThemeWrapper ctw = new ContextThemeWrapper(context, R.style.DarkAlert);
SpannableStringBuilder ssBuilder = new SpannableStringBuilder(message);
RelativeSizeSpan largeSizeText = new RelativeSizeSpan(1.0f);
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.GREEN);
ssBuilder.setSpan(largeSizeText, 0, message.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssBuilder.setSpan(foregroundColorSpan, 0, message.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
AlertDialog ad = new AlertDialog.Builder(ctw)
.setTitle(title)
.setMessage(ssBuilder + message2)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Do something
dialog.dismiss();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setCancelable(false)
.create();
return ad;
}
我如何调用对话框:
Utils.createDarkDialog(mContext, "Title:", "This should be green" + "nn", "and this should be white.").show();
如果其他人提出这样的问题,我通过替换这一行来解决它:
.setMessage(ssBuilder + message2)
有了这个:
.setMessage(ssBuilder.append("nn" + message2))
现在它按应有的方式工作;)
我的猜测是,在setMessage(ssBuilder + message2)
中,java会将对象强制为相同的类型(ssBuilder是SpannableStringBuilder,message2是String),然后将它们连接起来。在这种胁迫期间,事情变得一团糟。
您可以尝试为消息 2(假设 ssBuilder2)创建一个根据需要格式化的 SpannableStringBuilder,然后连接调用setMessage(ssBuilder + ssBuilder2)
。