美文网首页基础Android_SpeakAndroid UI
闲谈Android中的@和?符号的引用区别

闲谈Android中的@和?符号的引用区别

作者: GB_speak | 来源:发表于2017-05-17 12:15 被阅读172次

在 Android 项目开发中,我们经常会用 “@” 或者 “?” 符号去引用系统或者我们应用内添加的资源,这两种符号的引用有什么区别呢,“?attr/” 与 “?android:attr/” 之间又有怎样的不同呢?本文我们不妨闲聊一下。

“@” 与 “?” 符号的引用在使用时都有一个规范的格式:"@[+][package:]type:name","?[package:][type:]name"。可以看到,二者均包含引用符号、资源所属的包、资源类型和资源名称。

@ 资源引用

“@” 符号用于引用系统和我们在项目中添加的一些固有资源(drawable,string 等),或者定义的 style 样式。比如:

android:text="@string/app_name" ```
这里的 app_name 就是我们自己定义在项目文件 values/strings.xml 中的字符串资源。

android:text="@android:string/cancel" ```
而这里的 cancel 属于 Android SDK 中的系统字符串资源,所以需要添加@android: 来指明引用来源。android: 是 package: 的一个具体实例。

? 属性引用

“?” 符号用于引用当前主题中定义的一些属性值。注意,“?” 符号通过属性名字间接引用当前主题中的对应属性值,而不是属性本身。举个例子:

android:divider="?android:listDivider" ```
这里的 “?” 符号通过属性名 android:listDivider 间接获取当前主题赋予该属性的值。如同 @android: 一般,?android: 表示该值源自 Android SDK 系统属性。由于在当前主题中寻找对应属性名的值,所以没有指定属性类型,其实等同于:?android:attr/listDivider。

那如何引用项目中自定义的属性呢?我们在 attrs.xml 中定义一个属性,如:

<declare-styleable name="CustomTextView">
<attr name="colorTextCustom" format="reference|color"/>
</declare-styleable> ```
显然,此时我们定义的 colorTextCustom 属性是没有值的,直接引用没有任何作用。需要在主题 style 中赋值:

<style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorTextCustom">#FF0000</item> 
</style> 
 
<style name="AppTheme" parent="BaseTheme"> 
    <item name="android:textColor">?colorTextCustom</item> 
</style> ```
可以看到,这里在 BaseTheme 中对 colorTextCustom 属性赋值,并在 AppTheme 中通过 “?colorTextCustom” 引用该属性值。由于是本地项目中定义的属性,所以没有添加 android: 命名空间。其实,这种做法的好处是,AppTheme 所覆盖的 View 均可通过构造函数获取当前主题中的 colorTextCustom 属性值。

**R.attr & R.style**

Android SDK 中定义有很多属性和主题可供使用,详见官方文档:R.attr &R.style。使用系统资源的好处就是,满足不同系统的适配需求,较为灵活。

这里举几个常用的:

style="?android:attr/borderlessButtonStyle"```

Android 5.0 默认 Button 的样式自带边框阴影,可以使用这个系统样式去除该样式。当然,这是单独设置时的操作,为了方便全局控制,可以在 styles.xml 中自定义一个样式,继承一个无边框样式作为 parent:

<style name="CustomBorderlessButtonStyle" parent="@style/Widget.AppCompat.Button.Borderless"> 
    <item name="android:textColor">@android:color/white</item> 
    ... 
</style> ```
**android:background="?android:attr/selectableItemBackground"**

可用于设置一些 List Item、Button之类带点击效果的背景。该样式自带触摸点击效果,在 5.0 和更高版本上,更是附有 Ripple 涟漪效果,省去我们自己实现 selector 选择器的过程。当然我们也可以自己使用 <ripple> 标签定义一个 drawable 文件实现涟漪效果,只是需要注意版本限制。

**android:background="?android:attr/dividerVertical"**

实现分割线背景。

还有一些其他有用的系统资源,这里就不一一列举了...

相关文章

  • 闲谈Android中的@和?符号的引用区别

    在 Android 项目开发中,我们经常会用 “@” 或者 “?” 符号去引用系统或者我们应用内添加的资源,这两种...

  • Android的xml文件中引用类型

    Android xml资源文件中@、@android:type、@*、?、@+含义和区别 一.@代表引用资源 1....

  • 指针和引用的辨析

    先来看两个图 指针与引用的区别 1.指针在C和C++中均有,而引用是C++独有的特性(*指针申明符号,&引用申明符...

  • Java中的引用和区别

    一、java中有哪几种引用,他们的含义和区别是什么? 含义 强引用(StrongReference) 是使用最普遍...

  • Java四种引用对比

    前言 面试题:Java中的软引用,弱引用在Android 是哪个的使用 目录 一:哪四种引用 二:区别在哪 三:在...

  • 类的加载/卸载

    符号地址与引用地址的区别是什么? 在编译时,java类并不知道引用类的实际内存地址,因此只能使用符号引用来代替。比...

  • 符号引用和直接引用

    在JVM的类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用。 符号引用 符号引...

  • C++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • Swift 关键词 -- struct/enum/mutatin

    struct struct 值引用 在swift中,类型引用和值引用的区别在于,对于类型引用(class refe...

  • webpack+vue学习笔记

    路径中引用中的@符号是什么意思? 在看使用webpack打包的项目代码时,经常会看到在路径中引用@符号import...

网友评论

    本文标题:闲谈Android中的@和?符号的引用区别

    本文链接:https://www.haomeiwen.com/subject/pjldxxtx.html