---
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_<a>_<b>` 或 `sp_<a>_<b>`。
   - 例：`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 未定义统一资源名：先向用户确认或按项目已有约定处理。
