Android访问资源与属性之 ? , @

Android访问资源与属性之 ? , @

在Android xml中访问资源和样式属性的语法有着固定的格式,但是也有些灵活变化。
比如通过xml布局设置一个viewbackground color的几种方法:

android:background="@color/colorPrimary"
android:background="@com.myapp:color/colorPrimary"
android:background="?colorPrimary"
android:background="?attr/colorPrimary"
android:background="?com.myapp:attr/colorPrimary"
android:background="?com.myapp:colorPrimary"
android:background="?android:colorPrimary"
android:background="?android:attr/colorPrimary"

上面这些语法主要区别是对资源的访问和对样式属性的访问,详细可参考Android开发官网

引用资源(resources) 与 引用样式属性(style attribute) 的区别

@ 引用资源 (resources)

使用@语法引用资源时,是在访问一个实际的值(官网上标题使用 Accessing Resouces),这个资源必须有具体的值,我们能明确的知道自己使用的是哪个具体值。

比如定义了一个color资源:

.../values/color.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#5F51B5</color/
</resources>

然后在xml中引用这个资源android:background="@color/colorPrimary",那么不管Activity是什么主题,background的值始终是确定值#5F51B5

? 引用样式属性 (style attribute)

使用?语法时,表示尝试引用一个样式属性(Referencing style attributes),具体的值取决于当前使用的主题。在特定的主题下,可以重写这个属性,因此不需要改变xml主题,只需要应用恰当的主题,background具体值就改变了。

<resource>
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">#F0A</item>
    </style>
</resource>
<TextView
    android:id="@+id/tv_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="?colorPrimary"

在这种情况下,我们询问Android:“嘿,把当前主题下定义的colorPrimary属性的值给我”。所以我们很难告诉你background到底会是什么颜色,因为它取决于这个布局所属的activity所应用的主题。

语法

引用资源 (@)

在xml中引用一个资源使用下面这个语法:

@[<package_name>:]<resource_type>/<resource_name>

  • <package_name> 引用资源所在包的包名,** 如果在同一个包下引用,不是必须的; 使用android表示使用系统资源 **
  • <resource_type> R类的子集,即资源的类型(attr, color, string, dimen 等等)
  • <resource_name> 资源名称,可以是不带后缀的资源文件名或者定义在xml中的资源

引用样式属性 (?)

?[<package_name>:][<resource_type>/]<resource_name>

引用样式属性语法和引用资源除了前缀是?,其他是一样的,其中<resource_type>/是个可选项,因为引用样式属性唯一的资源类型是attr,android打包工具允许我们省略资源类型。

所以从Android角度来看,下面的表述方式是完全一样的:

android:background="?com.myapp:attr/colorPrimary" // verbose format
android:background="?com.myapp:colorPrimary" // attr is skipped since its optional
android:background="?attr/colorPrimary" // package is skipped since its optional
android:background="?colorPrimary" // package & attr is skipped

引用系统样式属性:?android:colorPrimary

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,050评论 25 709
  • 你心有些散 得静下来。 书还要看 题还得刷。 学校定了吧? “定了。” 那就好 慢慢来 不要急 量变到质变还需要些...
    一盏星光阅读 1,558评论 0 0
  • 2017年2月有幸做了母亲。因为超出预产期一周并且骨盆条件不佳而选择了剖腹产。当听到宝宝第一声啼哭时,有落泪的冲动...
    羽小辰阅读 2,944评论 0 0
  • 7个基本指标: 先用一个你熟悉的知识门类来检查。例如:哲学。如果你熟悉的门类的书种很不完整,当然值得你怀疑其他门类...
    歌儿_9740阅读 1,328评论 1 1
  • 1. 最近几天的朋友圈泾渭分明的站成了三个派系: 被指责成口红婊的女人,指责跟男友要YSL的女人是口红婊的女人、和...
    赤木与森阅读 10,215评论 16 86

友情链接更多精彩内容