Android 开发杂记——@, @+, ? 的介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ajianyingxiaoqinghan/article/details/79435784

Android 开发杂记——@, @+, ? 的介绍

马上要毕业了,趁着毕业之前随便学了一些技术。前段时间刚把一本《Head First 设计模式》学完,现在开始着手学习 Java + Android。在 Android 官网上找了一些例程源码进行学习,发现完全看不懂啊,需要学的又有很多…… 那就重头来吧,打开新世界什么的我最喜欢了~ 首先,先从笔者最不解的部分开始,即用来布局的 xml 文件中的一些符号,如 @, @+, ? 等。

参考博客: 《Android之?,@,@+代表的作用和意义》 《Android R.java类的手动生成》


一. 简述

在笔者刚开始的 Android 开发过程中,在布局文件的 xml 文档中看到了如下符号:

对于这种@, @+类似的符号,笔者十分不解,于是查了一下这些符号的应用效果。在说明这些符号之前,需要首先介绍一下 Android 的 R 类。 在 Android 项目中,res 目录中包含了项目使用的各种资源,所有资源分布在 res 目录下的各个子目录。每个资源有类型名字两个属性,此外 res 目录下的所有资源在编译后都有一个对应的 ID,这个 ID 是由一个名叫 R.java 的类(简称 R 类)定义的。在java 代码中,通过 R 类获取到资源的 ID 后,就可以调用 Android API 来调用对应资源。代码如下所示:

final Button remove = (Button) view.findViewById(R.id.remove);
final Button disable = (Button) view.findViewById(R.id.disable);

而在xml 布局代码中,定义一个控件的代码如下:

    <Button
        android:id="@+id/remove"
        android:text="@string/remove_shortcut"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:visibility="visible"
        style="@android:style/Widget.Material.Button.Borderless"/>
    <Button
        android:id="@+id/disable"
        android:text="@string/disable_shortcut"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:visibility="visible"
        style="@android:style/Widget.Material.Button.Borderless"/>

其中 android:id 后面的部分即为定义 ID。在该部分中,经常会看到 @, @+, ? 之类的符号。下面对着几种符号进行说明。

二. @ 符号

@ 符号的作用是引用资源文件,引用格式如下:

@[<package_name>:]<resource_type>/<resource_name>
  • < package_name >:包名,可选项
    • 默认引用当前包名下的资源文件
    • 可以加上 android 的包名,表示引用系统的资源文件;
  • < resource_type >:资源类型
  • < resource_name >:资源名称

例程 1:

<TextView
    ...
    android:text="@string/existing_shortcuts"
    ...
/>

这里将该 TextView 的 text 部分定义为 string 类型,并命名为 existing_shortcuts。

例程 2:

<ListView
    ...
    android:id="@android:id/list"
    ...
/>

这里将 ListView 控件的 ID 定义为 android 包中的 id 类型,并命名为 list。

三. ? 符号

? 符号的作用是引用当前主题的属性。? 符号的语法格式如下:

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

当使用 ? 符号时,提供的资源名必须能够在主题属性中找到,因为资源工具认为该资源属性是被期望得到的。 该属性值只能在样式资源XML 属性中使用,且允许你将它们改变为当前主题提供的标准变化来改变 UI 元素的外观,而不是改变具体的值。

例如如下代码:

android:textColor="?android:textDisabledColor"

等同于:

android:textColor="?android:attr/android:textDisabledColor"

这里引用的是主题中按钮不可用时的颜色,即系统定义好的颜色值:darker_gray。

四. @+ 符号

如果我们需要引用资源,就必须要在 R.java 中添加一条记录,方可进行引用。@+ 符号的作用就是添加一条记录。@+ 的使用格式如下:

@+<resource_type>/<resource_name>

@+ 符号使用最多的地方,一般是为控件加入 id。如之前在简述部分中的一段代码:

<Button
    android:id="@+id/disable"
    ...
/>

这里表明在 R.java 文件的静态内部类 id 下查找名为 disable 的 Button 控件,如果不存在,就创建一个。 同理,在 string, dimens, styles 里面,也是使用 @+id 的方式添加标识符。但在 drawable, mipmap, anim, attr 目录下,系统会默认将文件夹的名字作为 resource_type。

后记

好久没有写博客了,写该篇博客也是拿到 Google 的 Android 应用源代码,硬怼之后发现怼不动,就把不懂的地方挑出来,用写博客的方法增强记忆。 马上毕业进入工作了,由于工作性质原因,以后写博客和传 Github 的时间应该会越来越少。但学无止境,愿以后进入工作之后,依旧能够学习足够多且有趣的技术吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券