arrays.xml中定义字符串数组必须使用<string-array>标签,且需置于res/values/下、name属性合法、item数量多语言严格一致,读取时须判空,不支持HTML渲染与换行符。

arrays.xml 里定义字符串数组必须用 <string-array> 标签
Android 的 arrays.xml 不是随便写个 XML 就能被识别为资源数组——系统只认 <string-array>、<integer-array> 和 <array> 这三种根标签。写成 <resources> 下直接放一堆 <item>,或者套了个自定义标签(比如 <my_list>),运行时 Resources.getIdentifier() 找不到,getResources().getStringArray(R.array.xxx) 直接抛 NotFoundException。
实操建议:
-
arrays.xml必须放在res/values/目录下(不能放values-zh之类限定目录里,除非你明确要按配置分组) - 每个数组必须有唯一
name属性,且只能含字母、数字、下划线,不能以数字开头 -
<item>内容支持引用其他字符串资源(如@string/app_name),但不支持拼接或表达式
在 Java/Kotlin 中读取字符串数组要防空指针和越界
getStringArray(R.array.xxx) 返回的是 String[],不是 ArrayList 或 listOf,它不会自动判空,也不会做长度校验。如果资源 ID 错了、数组没定义、或编译时资源未打包进去,方法直接返回 null —— 后续调用 .length 或遍历就会崩。
实操建议:
- 读取后立刻判空:
val items = resources.getStringArray(R.array.my_list); if (items == null) return - 需要转
List时用Arrays.asList(items),但注意它返回的是固定大小列表,add()会抛UnsupportedOperationException - 不要在
onCreate()之前调用(比如静态块里),resources尚未初始化
字符串数组不支持带格式的 HTML 文本
你可能想在数组里写 <b>重要</b> 或 ,指望显示加粗或空格——不行。getStringArray() 返回的是纯字符串,XML 实体(如 )会被解码,但 HTML 标签本身不会被渲染。系统把它当普通文本处理,<code><b> 就真的显示成 “<b>重要</b>” 四个字符。
实操建议:
- 真要富文本,改用
getTextArray()(返回CharSequence[]),前提是原<item>里用<![CDATA[...]]>包裹,并确保内容是合法 HTML(Android 支持有限,仅<b>、<i>、<u>等基础标签) - 更稳妥的做法:数组里只存纯文本,样式逻辑交由 UI 层控制(比如用
SpannableStringBuilder动态加粗) - 别在
<item>里写换行符\n,XML 解析会吃掉它;要用换行,写成或直接在 CDATA 里用真实回车
多语言适配时 arrays.xml 不能靠文件名自动切换
很多人以为把 arrays.xml 复制一份到 values-zh-rCN/ 就能自动切中文数组——其实可以,但有个硬限制:所有同名数组(比如都叫 my_list)必须有**完全相同的 item 数量**。少一个、多一个,编译不报错,但运行时在某些机型上 getStringArray() 可能返回 null 或截断数据。
实操建议:
- 不同语言版本的
<string-array name="xxx">,<item>个数必须严格一致(哪怕某语言里某个项留空,也得写个空<item></item>) - 避免用数组存“开关类”数据(比如
["开启", "关闭"]),因为中英文词序可能不同,UI 布局容易错位;优先用单个字符串资源 + 逻辑判断 - 如果数组内容差异大(比如中文 5 项、英文 7 项),别硬凑,拆成多个小数组,用代码组合
shrinkResources true 不会删它),所以冗余数组会白占 APK 体积。










