#FF0000在Android项目开发中,我们经常使用“@”或“?”“/”和“?android:attr/”有什么区别?让我们在这篇文章中聊一聊。“@”和“?”的引用符号在使用时具有标准化格式:“@[+][package:]type:name”、“?[package:][type:]name”。如您所见,两者都包含引用符号、资源所属的包、资源类型和资源名称。@Resource引用“@”符号用于引用系统和我们在项目中添加的一些固有资源(drawable、string等),或者定义的样式。例如:android:text="@string/app_name"其中app_name是我们在项目文件values/strings.xml中定义的字符串资源。android:text="@android:string/cancel"而这里的cancel在AndroidSDK中属于系统字符串资源,所以需要加上@android:来表示引用来源。android:是package:的具体实例。?属性引用“?”symbol用于引用当前主题中定义的某些属性值。注意“?”symbol通过属性名间接引用当前主题中对应的属性值,而不是属性本身。例如:android:divider="?android:listDivider""?"这里的symbol是通过属性名android:listDivider间接获取当前主题赋给这个属性的值。与@android:类似,?android:表示该值源自AndroidSDK系统属性。由于在当前主题中找到对应属性名的值,所以不指定属性类型,实际上相当于:?android:attr/listDivider。如何在项目中引用自定义属性?我们在attrs.xml中定义一个属性,如:此时没有值,直接引用没有作用。需要在主题样式中赋值:#FF0000?colorTextCustom可以看到在BaseTheme中赋值了colorTextCustom属性的值,在AppTheme中通过"?颜色文本自定义”。由于是在本地项目中定义的属性,所以没有添加android:命名空间。其实这种做法的好处是AppTheme覆盖的View可以通过构造函数获取到当前主题中的colorTextCustom属性值。R.attr&R.styleAndroidSDK中定义了很多属性和主题供使用,详见官方文档:R.attr&R.style。使用系统资源的好处是可以更灵活地满足不同系统的适配需求。下面是几个常用的:style="?android:attr/borderlessButtonStyle"Android5.0默认的Button样式自带边框阴影,可以使用这个系统样式去掉。当然,这是单独设置的操作。为了方便全局控制,可以在styles.xml中自定义一个样式,作为parent继承一个无边框样式:@android:color/white...android:background="?android:attr/selectableItemBackground"可以用来设置一些ListItem,有点击效果的背景比如作为按钮。这种风格有自己的触摸和点击效果。在5.0及更高版本上,它还具有Ripple波纹效果,这为我们省去了自己实现选择器的过程。当然我们也可以使用标签定义一个drawable文件来实现波纹效果,但是需要注意版本限制。android:background="?android:attr/dividerVertical"实现分割线背景。还有一些其他有用的系统资源,这里就不一一列举了……