如何使用XML在Android的bool.xml文件中设置true或false布尔值变量?
- 内容介绍
- 相关推荐
本文共计800个文字,预计阅读时间需要4分钟。
必须放在+res/values/目录下,不能是+res/values-xx(例如+values-zh)的变体目录,除非你明确指定语言/配置限定。Android构建系统仅在基础+values中扫描+bool.xml,并且合并并使用;错误的放置位置会导致+Resources.NotFoundException或静默默认。
- 正确路径:
src/main/res/values/bool.xml - 错误路径:
src/main/res/values-en/bool.xml(不会被识别为布尔资源) - 如果需要多语言差异化布尔值,得用
bools.xml+Configuration逻辑判断,而不是靠资源限定符
XML 里怎么写 true/false 值才不报错
只能用小写的 true 和 false 字符串,不能写 True、1、yes 或空格包裹的 "true" —— 否则 aapt2 编译直接失败,报错信息类似:error: invalid boolean value 'True'.
- ✅ 正确:
<bool name="is_dark_mode">true</bool> - ❌ 错误:
<bool name="is_dark_mode">True</bool> - ❌ 错误:
<bool name="is_debug">1</bool> - 注意:布尔资源不支持表达式或引用其他资源(比如
@bool/xxx在 bool.xml 内部无效)
Java/Kotlin 中怎么安全读取 bool.xml 的值
用 getBoolean() 读取,别用 getInteger() 或 getString() 强转 —— 后者不会崩溃但会返回字符串字面量,逻辑全错。
- Kotlin:
resources.getBoolean(R.bool.is_dark_mode) - Java:
getResources().getBoolean(R.bool.is_dark_mode) - ⚠️ 千万别:
getString(R.bool.is_dark_mode).toBoolean()—— 这会把字符串"true"当成非空字符串转为true,但一旦资源名写错,getString()返回null,直接NullPointerException - 如果布尔值只是临时开关、且不需多语言或复用,优先考虑用
BuildConfig或常量,比资源更轻量
bool.xml 和 BuildConfig 什么时候该选谁
bool.xml 适合运行时可变、需配合资源限定符(如屏幕尺寸、夜间模式)切换的开关;BuildConfig 适合构建期确定、不同 flavor 或 buildType 固定的开关(比如 debug-only 功能)。
- 用 bool.xml:夜间模式开关、默认动画开关、地区功能开关(配合 values-night/values-hdpi)
- 用 BuildConfig:是否启用 Crashlytics、是否走 mock 接口、是否打印调试日志
- 混用风险:有人把
BuildConfig.DEBUG和getBoolean(R.bool.enable_log)逻辑耦合,结果 debug 包里enable_log设为false却还打日志——因为没意识到两者完全独立
getBoolean() 是唯一安全读法,别的都是自埋雷。本文共计800个文字,预计阅读时间需要4分钟。
必须放在+res/values/目录下,不能是+res/values-xx(例如+values-zh)的变体目录,除非你明确指定语言/配置限定。Android构建系统仅在基础+values中扫描+bool.xml,并且合并并使用;错误的放置位置会导致+Resources.NotFoundException或静默默认。
- 正确路径:
src/main/res/values/bool.xml - 错误路径:
src/main/res/values-en/bool.xml(不会被识别为布尔资源) - 如果需要多语言差异化布尔值,得用
bools.xml+Configuration逻辑判断,而不是靠资源限定符
XML 里怎么写 true/false 值才不报错
只能用小写的 true 和 false 字符串,不能写 True、1、yes 或空格包裹的 "true" —— 否则 aapt2 编译直接失败,报错信息类似:error: invalid boolean value 'True'.
- ✅ 正确:
<bool name="is_dark_mode">true</bool> - ❌ 错误:
<bool name="is_dark_mode">True</bool> - ❌ 错误:
<bool name="is_debug">1</bool> - 注意:布尔资源不支持表达式或引用其他资源(比如
@bool/xxx在 bool.xml 内部无效)
Java/Kotlin 中怎么安全读取 bool.xml 的值
用 getBoolean() 读取,别用 getInteger() 或 getString() 强转 —— 后者不会崩溃但会返回字符串字面量,逻辑全错。
- Kotlin:
resources.getBoolean(R.bool.is_dark_mode) - Java:
getResources().getBoolean(R.bool.is_dark_mode) - ⚠️ 千万别:
getString(R.bool.is_dark_mode).toBoolean()—— 这会把字符串"true"当成非空字符串转为true,但一旦资源名写错,getString()返回null,直接NullPointerException - 如果布尔值只是临时开关、且不需多语言或复用,优先考虑用
BuildConfig或常量,比资源更轻量
bool.xml 和 BuildConfig 什么时候该选谁
bool.xml 适合运行时可变、需配合资源限定符(如屏幕尺寸、夜间模式)切换的开关;BuildConfig 适合构建期确定、不同 flavor 或 buildType 固定的开关(比如 debug-only 功能)。
- 用 bool.xml:夜间模式开关、默认动画开关、地区功能开关(配合 values-night/values-hdpi)
- 用 BuildConfig:是否启用 Crashlytics、是否走 mock 接口、是否打印调试日志
- 混用风险:有人把
BuildConfig.DEBUG和getBoolean(R.bool.enable_log)逻辑耦合,结果 debug 包里enable_log设为false却还打日志——因为没意识到两者完全独立
getBoolean() 是唯一安全读法,别的都是自埋雷。
