--- name: android-dimen-dp-sp description: >- 将布局与代码中的硬编码 dp、sp 改为引用 @dimen/dp_*、@dimen/sp_* 与 R.dimen.*; 资源名规则为整数部分与一位小数部分用下划线连接(如 12.5 → dp_12_5)。 在用户要求去掉魔法数、统一 dimen、替换 dp/sp 字面量或规范化尺寸引用时使用。 --- # Android:硬编码 dp / sp → `@dimen/dp_*`、`@dimen/sp_*` ## 何时用本 Skill - 用户要把 **XML / Kotlin / Java** 里写死的 **`Ndp` / `Nsp`** 或等价的 dp、sp 数值,改成 **dimen 引用**。 - **不要**去仓库里搜索、推断或校验 `values/dimens.xml` 是否已有对应项:**默认视为已存在**,直接按规则写出 `@dimen/...` 与 `R.dimen....`。 ## 命名规则(核心) 1. **前缀**:物理长度用 `dp_`,文字尺寸用 `sp_`。 2. **有小数时**:`整数部分` + `_` + `小数点后那一位数字`(仅 **一位** 小数参与命名)。 - 小数部分命名里的 `_` **表示小数点**,不是第二个「任意分隔符」。 3. **一位小数的得出方式**(与「12.5555 → dp_12_5」一致):**截断**到小数点后一位(丢弃第二位及以后),**不**按四舍五入成 12.6。 4. **无小数(整数)时**:`dp_12`、`sp_8`,**不要**写成 `dp_12_0`(除非用户项目已有该风格再跟随项目)。 | 原始数值(dp 或 sp,单位一致即可) | 资源名(dp 示例) | XML 引用 | 代码引用 | | :--- | :--- | :--- | :--- | | 0.5 | `dp_0_5` | `@dimen/dp_0_5` | `R.dimen.dp_0_5` | | 12.5 | `dp_12_5` | `@dimen/dp_12_5` | `R.dimen.dp_12_5` | | 12.5555 | `dp_12_5`(先截断为 12.5) | `@dimen/dp_12_5` | `R.dimen.dp_12_5` | | 12 | `dp_12` | `@dimen/dp_12` | `R.dimen.dp_12` | `sp` 同理:`12.5sp` → `@dimen/sp_12_5`、`R.dimen.sp_12_5`。 ## 从字面量到资源名的算法(给 Agent 执行用) 对某个 **dp 或 sp** 的数值 `v`(只看数字部分): 1. 若 `v` 为整数(或可视为整数):资源名为 `dp_<整数>` 或 `sp_<整数>`。 2. 若 `v` 有小数部分:将 `v` **截断**到小数点后一位得到 `v'`,拆成整数部分 `a` 与一位小数数字 `b`(`b` 为 0–9),资源名为 `dp__` 或 `sp__`。 - 例:`v = 12.5555` → `v' = 12.5` → `a = 12`, `b = 5` → `dp_12_5`。 - 例:`v = 0.5` → `v' = 0.5` → `dp_0_5`。 ## XML 写法 - 将 `android:padding="12.5dp"`、`tools:layout_margin="8sp"` 等中的 **字面量** 改为 **`@dimen/dp_12_5`**、**`@dimen/sp_8`** 等形式;**不要**在属性值里再保留 `dp`/`sp` 后缀(dimen 条目自身已带单位语义)。 - 若原先是 `tools:` 或 `app:` 等命名空间,只替换尺寸字面量部分,其余属性名与命名空间不变。 ## Kotlin / Java 写法 - 需要 **资源 id** 时:`R.dimen.dp_12_5`、`R.dimen.sp_8` 等,与上述命名一致。 - 取像素时仍按项目惯例使用 `resources.getDimension(R.dimen.dp_12_5)` 等;本 Skill 只规定 **资源名与引用形式**,不规定用 px 还是 dp 的封装工具类。 ## 注意 - **只改 dp/sp 到 dimen 的映射与引用**;不要顺带「优化」无关布局、不要擅自新建 `dimens.xml` 条目(除非用户明确要求创建资源文件)。 - 负值、表达式(如 `10dp+2dp`)若出现,本 Skill 未定义统一资源名:先向用户确认或按项目已有约定处理。