字符串资源中的特殊字符不显示在警报对话框中 (Android)

Special characters in a string resource don't show up in Alert Dialog (Android)

一个奇怪的,但我刚刚注意到对话框中没有显示特殊字符

例如 xml

中定义的以下字符串

<string name="some_string">A string which has stuff "In Quotation" indeed.</string>

在警告对话框中这样使用时

val message = resources.getString(R.string.some_string)
val builder = AlertDialog.Builder(context)
            .setMessage(message)
   builder.show()

而不是显示为包含 "In Quotation" 内容的字符串 仅在对话框中

它显示为一个字符串,其中确实包含 In Quotation 的内容。没有“”

写成:

<string name="some_string">A string which has stuff \"In Quotation\" indeed.</string>

如果要保存其他字符串:

val message = resources.getString(R.string.some_string)
message = message .replace("\"", "&quot;")
val builder = AlertDialog.Builder(context)
            .setMessage(message)
builder.show()

如果您想在 xml 中编辑:

<string name="some_string">A string which has stuff \"In Quotation\" indeed.</string>

示例 我会在评论中说的话。

String message = getString(R.string.app_name);
AlertDialog.Builder builder = new AlertDialog.Builder(this).setMessage(message);
builder.show();

XML

<string name="app_name">\&quot;Mes Dépenses\&quot;</string>

测试于

Android api 19

[更新]

为什么是对话而不是其他我认为是因为在 android.

中合并

看到这个CharSequence

A CharSequence is a readable sequence of char values. This interface provides uniform, read-only access to many different kinds of char sequences. A char value represents a character in the Basic Multilingual Plane (BMP) or a surrogate. Refer to Unicode Character Representation for details.

XML allows the use of any of the Unicode-defined encodings, and any other encodings whose characters also appear in Unicode. XML also provides a mechanism whereby an XML processor can reliably, without any prior knowledge, determine which encoding is being used.[12] Encodings other than UTF-8 and UTF-16 are not necessarily recognized by every XML parser.

AlertDialog setMessage

CharSequence 是接口,所以他们没有 toString() 他们必须使用 charAt()chars() 取决于 api

Android 中的字符使用 ASCII 检查此

https://en.wikipedia.org/wiki/Unicode_symbols

换句话说,他们必须跳过 " 字符,因为他们认为是字符串连接。这就是为什么我认为我们需要添加 \

您可以像这样使用 Html class 中的 fromHtml 方法。对于 API 超过 24 个,您可以使用带有标志的方法,如下所述。

我已经用我的代码进行了测试并且工作正常。希望对你有帮助。

var dialogHeader = Html.fromHtml("&ldquo; " + "Awesome title text" + " &rdquo;", Html.FROM_HTML_MODE_COMPACT).toString()

AlertDialog.Builder(this)
        .setMessage(dialogHeader)
        .show()

注意:您也可以使用 Html.fromHtml(string) 代替我在我的应用中使用的 Html.fromHtml(string, intFlag) API >= 24.