
1. TextView 属性速查为什么总在重复查文档做 Android 开发的朋友大概都有过这种体验写一个带图标的按钮明明记得有个drawableLeft但和drawablePadding一起用时间距怎么调都不对或者想给文字加个阴影shadowColor设了却没反应折腾半天才发现忘了配shadowRadius。TextView 是 Android 布局里出现频率最高的控件之一属性数量多、命名相似、部分属性只在特定控件或特定版本下生效导致「查了忘、忘了查」成了日常。这篇内容面向的正是这个高频场景你在写 XML 布局或调试显示效果时需要快速确认某个属性的作用、取值范围和易错点同时希望借助 AI 把「描述需求 → 生成布局代码」这条链路走通。我会先给出一份可复制的属性速查表按功能分类整理常用属性再给出一套 AI 辅助生成 XML 的提示词模板最后把 TaoToken 统一 Key 接入 API 的配置步骤和验证动作写清楚让你在查阅属性说明、生成代码片段时有一个稳定的调用入口。需要说明的是TextView 的属性大致可以分成几类文本内容与样式类text、textSize、textColor、textStyle、typeface、排版与行控制类gravity、lines、maxLines、singleLine、ellipsize、lineSpacingExtra、图文混排类drawableLeft/Right/Top/Bottom、drawablePadding、交互与输入类inputType、imeOptions、cursorVisible、digits、以及外观修饰类shadowColor、shadowRadius、textAppearance。分类之后你会发现很多「记不住」其实是因为属性散落在不同维度按类归档后记忆负担会小很多。下面这份速查表是我按实际使用频率整理的你可以直接复制到自己的笔记里。表格里我特意标注了「易错点」这一列因为踩过的坑往往比属性本身更值得记。属性作用常用取值易错点android:text显示文本字符串或 string 引用直接写中文建议抽到 strings.xmlandroid:textSize文字大小15sp、18sp必须用 sp用 dp 会不随系统字体缩放android:textColor文字颜色#FF0000、color/xxx与 textColorHint 区分android:textStyle字形bold、italic、bold|italic多个值用竖线连接android:typeface字体normal、sans、serif、monospace只支持这四种常量android:gravity文本在控件内的对齐center、center_horizontal、top|left和 layout_gravity 不是一回事android:lines固定行数2、3设了就会占满对应行高android:maxLines最大行数2常与 ellipsize 搭配android:singleLine单行显示true/false已废弃建议用 maxLines1android:ellipsize超长省略方式end、start、middle、marqueemarquee 需配合 singleLine 或 maxLines1android:lineSpacingExtra行间距4dp单位用 dpandroid:lineSpacingMultiplier行间距倍数1.2与 Extra 同时用时叠加android:drawableLeft左侧图标drawable/ic_xxx图标大小受 drawable 自身尺寸影响android:drawablePadding图文间距8dp单独使用无效必须配合 drawableXxxandroid:shadowColor阴影颜色#80000000必须与 shadowRadius 一起用android:shadowRadius阴影半径3.0设 0.1 几乎等于文字本色android:shadowDx/Dy阴影偏移2、2不设偏移阴影会被文字盖住android:inputType输入类型textPassword、number、phone在 EditText 才真正生效android:imeOptions软键盘动作actionDone、actionSearch需配合 inputType 使用android:cursorVisible光标显隐true/false默认显示android:digits允许输入的字符0123456789.-只对可编辑控件有效android:maxLength最大字符数11超出部分不显示也不输入android:ems宽度为 N 个字符宽10一个汉字算一个 emandroid:maxEms/minEms最大/最小字符宽20 / 5与 ems 同时用时覆盖 emsandroid:includeFontPadding是否含字体额外留白true/false设 false 可让文字更贴边android:textAppearance引用系统文字外观?android:attr/textAppearanceLarge用 ? 开头表示引用主题属性android:textScaleX文字横向缩放1.0f、1.5f影响字间距观感android:linksClickable链接是否可点true/false需配合 autoLinkandroid:freezesText保存文本与光标位置true/false常用于需要恢复状态的场景表格只是起点。真正让效率提升的是把「查属性」这件事交给 AI让它根据你的自然语言描述直接产出可用的 XML。但这里有个前提你得有一个稳定的模型调用入口否则每次都要在多个平台之间切换 Key反而更麻烦。这就是 TaoToken 统一 Key 接入要解决的问题——用一个 Key 走通对话与代码生成把属性查询和布局生成放在同一条工作流里。2. TaoToken 统一 Key 前置准备与接入定位在动手写配置之前先把 TaoToken 的定位说清楚。它提供的是统一的 API 接入层你拿到一个 Key 之后可以通过兼容的接口去调用模型能力用于对话、代码生成、属性说明查询等场景。官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数配置时直接用这个基址即可。前置准备分三步。第一步是注册并登录进入控制台创建 API Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在控制台里可以管理 Key、查看用量。第二步是确认你要用的模型 ID不同模型在代码生成和中文理解上的表现有差异建议先用一个通用对话模型跑通链路再按需切换。第三步是准备好调用环境本文以命令行 curl 和 Android 项目中的 Gradle 配置为例你不需要额外装什么重型工具。这里要强调一个容易混淆的点TaoToken 不是编辑器插件也不替代 Android Studio。它的角色是「模型能力的统一入口」你在 Android Studio 里写代码遇到属性不确定时通过 API 把问题发给模型拿到解释或 XML 片段再贴回项目。所以接入的重点是「配置一次、多处复用」而不是把 IDE 换掉。关于 Key 的安全我的建议是不要把 Key 硬编码进 Android 项目的源码里尤其是要提交到 Git 的模块。正确做法是放在本地环境变量或local.properties中通过 Gradle 读取后注入 BuildConfig或者只在开发机的命令行工具里使用。下面给出一个local.properties的示例路径与 Android 项目根目录一致# local.properties不要提交到版本库 TAOTOKEN_API_KEYsk-你的实际Key TAOTOKEN_BASE_URLhttps://taotoken.net/api然后在build.gradle模块级里读取并注入android { defaultConfig { buildConfigField String, TAOTOKEN_BASE_URL, \${project.findProperty(TAOTOKEN_BASE_URL) ?: https://taotoken.net/api}\ } }这样配置的好处是Key 和基址都从本地属性读取源码里不出现明文。如果你只是想在命令行里快速查属性那更简单直接导出环境变量即可export TAOTOKEN_API_KEYsk-你的实际Key export TAOTOKEN_BASE_URLhttps://taotoken.net/api前置准备做到这里就够了。接下来进入可复制配置环节我会给出完整的请求体 JSON 和调用命令你可以直接改 Key 后运行。3. 可复制配置JSON 请求体与 XML 生成提示词模板这一节是全文的操作核心。我会给出两样东西一是调用 TaoToken API 的完整 JSON 配置二是用于生成 TextView XML 的提示词模板。两者配合使用就能实现「描述需求 → 拿到布局代码」。先看请求体。TaoToken 的 API 基址是 https://taotoken.net/api 对话补全的路径按兼容规范拼接。下面是一个可直接复制的 JSON 请求体注意model字段填你实际要用的模型 ID{ model: your-model-id, messages: [ { role: system, content: 你是一名资深 Android 开发工程师精通 TextView 属性与 XML 布局。回答时先给结论再给可直接使用的 XML 代码代码块标注 xml。 }, { role: user, content: 请生成一个 TextView要求文字居中、最多两行、超出用省略号、左侧带一个 16dp 的图标、图标与文字间距 8dp、文字大小 16sp、颜色 #333333。 } ], temperature: 0.3, max_tokens: 800 }对应的 curl 调用命令如下Key 从环境变量读取避免明文出现在命令历史里curl -s ${TAOTOKEN_BASE_URL}/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer ${TAOTOKEN_API_KEY} \ -d { model: your-model-id, messages: [ {role: system, content: 你是一名资深 Android 开发工程师精通 TextView 属性与 XML 布局。回答时先给结论再给可直接使用的 XML 代码代码块标注 xml。}, {role: user, content: 请生成一个 TextView要求文字居中、最多两行、超出用省略号、左侧带一个 16dp 的图标、图标与文字间距 8dp、文字大小 16sp、颜色 #333333。} ], temperature: 0.3, max_tokens: 800 }如果你更习惯用配置文件管理可以写一个taotoken.toml放在项目根目录内容如下[taotoken] base_url https://taotoken.net/api api_key_env TAOTOKEN_API_KEY default_model your-model-id timeout_seconds 30 [generation] temperature 0.3 max_tokens 800这个 TOML 只是给你做参数归档用实际调用时把值读出来拼进请求即可。重点在于Base URL、Key、Model ID 这三件套要成对出现缺一个都会导致请求失败。很多新手报 401就是因为只填了 Key 没填对 Base URL或者 Model ID 写成了别的平台的名称。接下来是提示词模板。我把它拆成「角色 约束 输出格式」三段你可以直接套用角色你是一名资深 Android 开发工程师熟悉 TextView 全部常用属性。 约束 1. 只使用 Android 原生属性不引入第三方库。 2. 单位优先使用 sp文字和 dp间距。 3. 涉及图文混排时必须同时给出 drawableXxx 和 drawablePadding。 4. 涉及省略号时必须同时给出 maxLines 和 ellipsize。 输出格式 - 先用一句话说明关键属性组合。 - 再给出完整 XML 代码块语言标注为 xml。 - 最后列出 1 到 2 个容易踩的坑。 需求{在这里写你的具体需求}把「需求」替换成你的实际场景比如「一个带阴影的标题文字阴影半径 3偏移 2颜色半透明黑」模型就会按模板输出。实测下来加了「必须同时给出」这类硬约束后生成代码的可用率明显提高因为它不会漏掉成对出现的属性。这里再补一个属性说明查询的请求示例用于你只想问「某个属性是什么意思」的场景{ model: your-model-id, messages: [ {role: system, content: 你是 Android 属性词典回答简洁给出属性作用、取值、易错点三部分。}, {role: user, content: android:includeFontPadding 的作用是什么默认值是多少什么时候该设为 false} ], temperature: 0.2, max_tokens: 400 }配置到这里就齐了。下一节我会给出验证请求的具体动作和成功结果的判断标准确保你配完不是「看起来对」而是「确实通」。4. 验证请求与成功结果判断配置写完必须验证。验证分两个层次先验证 API 链路通不通再验证生成结果能不能用。第一层验证用一条最小请求确认鉴权和基址正确。执行下面的命令观察返回curl -s -o /tmp/taotoken_resp.json -w HTTP_STATUS:%{http_code}\n \ ${TAOTOKEN_BASE_URL}/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer ${TAOTOKEN_API_KEY} \ -d { model: your-model-id, messages: [{role: user, content: 回复两个字收到}], max_tokens: 20 }判断标准很明确如果终端输出HTTP_STATUS:200并且/tmp/taotoken_resp.json里能看到choices数组数组第一项的message.content里有内容就说明链路通了。如果状态码是 401说明 Key 无效或没带上如果是 404多半是 Base URL 拼错了路径如果是超时检查网络和timeout_seconds设置。第二层验证用第 3 节的 XML 生成请求跑一次把返回的 XML 贴进 Android Studio 的布局文件里看是否报错、预览是否正常。一个成功的返回应该长这样节选{ choices: [ { message: { role: assistant, content: 关键组合maxLines ellipsize 控制省略drawableLeft drawablePadding 控制图文间距。\n\nxml\nTextView\n android:layout_width\wrap_content\\n android:layout_height\wrap_content\\n android:gravity\center\\n android:maxLines\2\\n android:ellipsize\end\\n android:drawableLeft\drawable/ic_star\\n android:drawablePadding\8dp\\n android:textSize\16sp\\n android:textColor\#333333\ /\n\n\n易错点drawablePadding 单独写无效必须和 drawableLeft 一起出现。 } } ] }拿到这段内容后你要做的是把 XML 代码块提取出来放进res/layout/下的布局文件然后看 Android Studio 的 Preview 是否正常渲染。如果图标没显示检查drawable/ic_star是否存在如果省略号没生效检查maxLines和ellipsize是否同时存在。这一步的验证动作很关键因为模型生成的代码不一定 100% 贴合你的项目资源人工核对是必要环节。再补一个验证属性说明查询的动作。用第 3 节的属性查询请求成功返回应该包含「作用、取值、易错点」三部分比如问includeFontPadding返回里应该提到「默认 true设为 false 可减少顶部和底部额外留白常用于让文字更贴边」。如果你拿到的回答是泛泛而谈、没有具体取值说明提示词约束不够回去把 system 角色写得更具体。验证通过后建议把这条 curl 命令封装成一个 shell 脚本比如ask_taotoken.sh参数化你的问题#!/usr/bin/env bash # ask_taotoken.sh QUESTION$1 curl -s ${TAOTOKEN_BASE_URL}/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer ${TAOTOKEN_API_KEY} \ -d { \model\: \your-model-id\, \messages\: [ {\role\: \system\, \content\: \你是 Android 属性词典回答给出作用、取值、易错点。\}, {\role\: \user\, \content\: \${QUESTION}\} ], \temperature\: 0.2, \max_tokens\: 400 }用法就是bash ask_taotoken.sh android:ems 和 android:maxEms 有什么区别。这样你查属性时不用每次手写 JSON效率会高很多。验证环节做到这里链路和结果都确认过了接下来进入排错部分。5. 常见报错排查401、local proxy failed 与 reading choices排错这一节我按真实遇到过的报错来写每个都给出原因和动作。这些报错在接入初期出现频率最高提前知道能省不少时间。第一个是 401 Unauthorized。返回体里通常会有invalid_api_key或authentication_error字样。原因有三个Key 没填、Key 填错、Key 前后带了空格或换行。排查动作是先用echo $TAOTOKEN_API_KEY确认环境变量有值再用echo -n $TAOTOKEN_API_KEY | wc -c看长度是否和你在控制台看到的一致。如果是从网页复制的很容易带上不可见字符建议重新复制一次。另外注意请求头格式必须是Authorization: Bearer sk-xxxBearer 和 Key 之间有一个空格少空格也会 401。第二个是local proxy failed或连接被拒绝。这类报错通常出现在你本机设置了网络代理但代理没有正确转发请求的情况下。排查动作是先确认你的调用环境是否能正常访问https://taotoken.net/api可以用curl -v看连接建立过程。如果公司网络有出口限制需要联系网络管理员放行。这里要提醒的是不要通过任何非正规的网络中转方式去绕过限制合规使用网络资源是前提。如果确认网络本身没问题再检查 Base URL 是否写成了带路径的完整地址正确写法是https://taotoken.net/api加上接口路径。第三个是reading choices相关报错比如解析返回时提示cannot read property choices of undefined。这说明你拿到的响应不是预期的 JSON 结构常见原因是请求被重定向到了登录页、返回了 HTML 错误页、或者模型 ID 不存在导致返回了错误对象。排查动作是先把原始响应打印出来看不要直接解析。用curl -s ... | head -c 500看前 500 个字符如果是 HTML说明请求没打到 API如果是{error: ...}看 error 里的 message 字段。模型 ID 不存在时错误信息里通常会提示model not found这时回控制台确认模型 ID 拼写。第四个是 OAuth 或鉴权方式混淆。有些平台用 OAuth token有些用 API Key两者不能混用。TaoToken 这里用的是 API Key 方式如果你从别处复制了 OAuth 的配置模板把Authorization头写成了Bearer oauth_token就会鉴权失败。排查动作是确认你用的是控制台里创建的 API Key而不是其他类型的凭证。为了让你对照更方便我把这几个报错整理成表格报错关键词可能原因排查动作401 invalid_api_keyKey 缺失/错误/带空格检查环境变量长度与请求头格式local proxy failed本机代理未正确转发用 curl -v 看连接过程确认网络可达reading choices undefined响应非 JSON 或模型 ID 错误打印原始响应前 500 字符OAuth 鉴权失败凭证类型混用确认使用控制台创建的 API Keymodel not found模型 ID 拼写错误回控制台核对模型 ID还有一个容易被忽略的点如果你在 Android 项目里通过 Gradle 注入 BuildConfig然后又在代码里拼接 URL注意不要重复拼接/v1。Base URL 是https://taotoken.net/api接口路径是/v1/chat/completions拼起来是https://taotoken.net/api/v1/chat/completions。如果你在 Base URL 里已经写了/v1再拼一次就变成/v1/v1/...会返回 404。排错的核心思路是「先看原始响应再定位环节」。不要一上来就改代码先把 curl 的原始输出看清楚大部分问题在响应体里已经写明了原因。6. 把属性速查与代码生成串成日常流程走到这里你已经有了速查表、提示词模板、可复制配置和排错清单。最后我想聊聊怎么把这套东西变成日常习惯而不是配完就忘。我的做法是在项目根目录放一个tools/文件夹里面放ask_taotoken.sh和一份prompts.md。prompts.md里存几套常用提示词一套用于生成 XML 布局一套用于查询属性含义一套用于排查布局显示问题。每次遇到不确定的属性先跑查询提示词拿到「作用、取值、易错点」三行说明需要生成代码时跑布局提示词把需求填进去。这样你不需要记住所有属性只需要记住「去哪里问、怎么问」。对于长期做 Android 开发、经常需要生成布局和排查问题的场景可以考虑用 Coding Plan 来管理调用额度入口是 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。如果你更想先在对话界面里试几个属性问题可以用模型对话入口 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 。需要管理 Key 和查看用量时去 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。接入过程中遇到细节问题接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。如果你用的是 Claude Code 这类命令行编码工具它的配置方式略有不同可以参考 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite 里的说明。不管用哪种入口核心都是那三件套Base URL 填https://taotoken.net/apiKey 用控制台创建的Model ID 按实际需求选。最后留一个我自己的实用技巧把速查表里的「易错点」列单独抽出来做成一个textview-pitfalls.md每次踩坑就追加一条。三个月后你会发现这份自建的坑位清单比任何官方文档都更贴合你的项目。属性会忘但踩过的坑不会白踩。