有用的Android系统资源
Posted
技术标签:
【中文标题】有用的Android系统资源【英文标题】:Useful Android system resources 【发布时间】:2011-02-07 13:05:26 【问题描述】:android 附带大量系统资源 (android.R
),可用于节省您的时间并使您的应用程序更轻巧。
例如,我最近发现 Android 为 Yes (android.R.string.yes
)、No (android.R.string.no
)、Cancel (android.R.string.cancel
) 和 Ok (android.R.string.ok
) 等字符串提供了本地化字符串。
您推荐使用哪些其他系统资源?还是有理由避免使用系统资源?
编辑:正如 Tomas 所指出的,其中一些资源可能不会产生您期望的结果(特别是,android.R.string.yes/no
返回 OK/Cancel
而不是 Yes/No
,正如报告的 here)。为了更好地控制,您可以从 Android 源代码中复制系统资源。
【问题讨论】:
如何从 xml 访问这些? “或者是否有理由避免使用系统资源?” - 如果您使用图标等系统资源,不保证所有版本的 android 都可以使用相同的图标,这可能会导致您的应用不一致。 投票结束,因为过于广泛/基于意见。 【参考方案1】:您可以在android package 中找到所有系统资源的完整列表。
每次我想在 Android 上做某事时,我都会检查是否有系统资源可以满足我想要做的事情。在搜索您可能需要的已经实现的资源时,导入 Android 源代码(特别是 their /res/ folder)会很有帮助,这样您就可以看到它们的具体实现。
就个人而言,我发现自己最常使用:
用于标准任务的内置 Android 布局,例如微调器下拉菜单。 Android ids (android.R.id
),因为如果你想使用 Android 的一些小部件,你经常需要使用这些(例如,TabHost/TabWidget
要求你使用“android:id/tabhost
”、“android:id/tabs
”和“android:id/tabcontent
”,如果你想实现 XML 布局)。
内置颜色,尤其是android.R.color.transparent
。
android.R.anim
中的 Android 内置淡入淡出动画。
【讨论】:
请记住,这些资源随您的 SDK 一起提供。查看特定平台目录下的data/res/
目录。我会小心重用可能会被 OEM 更改的东西——可绘制资源将是一个示例问题区域。
@CommonsWare 在实际设备上运行时,从哪里加载资源?
@ThomasW:除了“设备固件中的某处”之外,我不能说,因为我从来没有去寻找细节。对不起!
哇。有些地方甚至 @CommonsWare 都没有涉足。
@ThomasW 资源从 resources.arsc
文件加载。当您构建您的 apk 时,aapt
会编译您的资源并生成 resources.arsc
文件,该文件包含在 apk 中。【参考方案2】:
您可以通过 xml 中的 access system resources 使用 android 包名称来限定它们,即 "@android:string/ok"
【讨论】:
【参考方案3】:正如 CommonsWare 所提到的,您不必下载 Android 源代码库来检查资源;只需转到<android-sdk-dir>/platforms/android-X.X/data/res/
。但是,如果您开始使用这些,您很快就会失望地发现它们中的大多数不可通过android.R
类获得。大多数时候,无论如何我都必须将它们导入到我的 Eclipse 工作区中。 :-(
我最喜欢的资源是根据控件的聚焦/按下/禁用状态(如 android.R.drawable.btn_default)以不同方式显示的可绘制对象。我使用这些或调整它们来为我的应用程序创建自定义按钮。如您查看/data/res/drawable/btn_default.xml
所见,它们被定义为<selector>
XML 元素,该元素在运行时膨胀为StateListDrawable
。您还可以创建自己的 StateListDrawables,它们非常有用,既可以用作视图背景,也可以用作按钮的“复合可绘制对象”(参见 TextView.setCompoundDrawables()
)。
【讨论】:
我想知道,在实际设备上运行时,资源是从哪里加载的?【参考方案4】:请注意,翻译真的很糟糕。
例如,android-25 中的德语“no”是“Abbrechen”,实际上是“取消”的意思。 “是”翻译成“OK”……
我不确定其他语言有多好,所以我会使用自己的翻译。
【讨论】:
不是翻译不好。正如 OP 在他的问题中指出的那样,android.R.string.yes/no
返回OK/Cancel
而不是Yes/No
。这可能是因为开发者认为android.R.string.yes/no
比android.R.string.ok/cancel
更简洁。
另外,android.R.string.ok
似乎没有被翻译。我测试过的每种语言都“OK”。 (对于某些语言,“OK”是不合适的。)以上是关于有用的Android系统资源的主要内容,如果未能解决你的问题,请参考以下文章