关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android Support Annotations 使用详解

    Android Support Annotations 使用详解

    2015-07-23 00:00:00 出处:codeceo
    分享

    在Android Support Library19.1版本中,Android工具小组引入了几个很酷的注解类型,供开发者在工程中使用。Support Library自身也使用这些注解,这是一个好兆头。就让我们好好研究下。

    通过gradle可以很容易的把这些注解添加到我们的工程中:

    compile 'com.android.support:support-annotations:20.0.0'

    有三种类型的注解可供我们使用:

    Nullness注解; 资源类型注解; IntDef和StringDef注解;

    我们将通过代码例子来讲解每一种类型的作用以及在工程中如何使用它们。

    Nullness注解

    使用@NonNull注解修饰的参数不能为null。在下面的代码例子中,我们有一个取值为null的name变量,它被作为参数传递给sayHello函数,而该函数要求这个参数是非null的String类型:

    public class MainActivity extends ActionBarActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            String name = null;
            sayHello(name);
        }
    
        void sayHello(@NonNull String s) {
            Toast.makeText(this, "Hello " + s, Toast.LENGTH_LONG).show();
        }
    }

    由于代码中参数String s使用@NonNull注解修饰,因此IDE将会以警告的形式提醒我们这个地方有问题:

    深入浅出Android Support Annotations

    假如我们给name赋值,例如String name = “Our Lord Duarte”,那么警告将消失。使用@Nullable注解修饰的函数参数或者返回值可以为null。假设User类有一个名为name的变量,使用 User.getName()访问,那么我们可以编写如下代码:

    public class MainActivity extends ActionBarActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            User user = new User("Our Lord Duarte");
            Toast.makeText(this, "Hello " + getName(user), Toast.LENGTH_LONG).show();
        }
        @Nullable
        String getName(@NonNull User user) {
            return user.getName();
        }
    }

    因为getName函数的返回值使用@Nullable修饰,所以调用:

    Toast.makeText(this, "Hello " + getName(user), Toast.LENGTH_LONG).show();

    没有检查getName的返回值是否为空,将可能导致crash。

    资源类型注解

    是否曾经传递了错误的资源整型值给函数,还能够愉快的得到本来想要的整型值吗?资源类型注解可以帮助我们准确实现这一点。在下面的代码中,我们的sayHello函数预期接受一个字符串类型的id,并使用@StringRes注解修饰:

    public class MainActivity extends ActionBarActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            sayHello(R.style.AppTheme);
        }
    
        void sayHello(@StringRes int id) {
            Toast.makeText(this, "Hello " + getString(id), Toast.LENGTH_LONG).show();
        }
    }

    而我们传递了一个样式资源id给它,这时IDE将提示警告如下:

    深入浅出Android Support Annotations

    类似的,我们把警告的地方使用一个字符串资源id代替警告就消失了:

    sayHello(R.string.name);

    IntDef和StringDef注解

    大家要介绍的最后一种类型的注解是基于Intellij的“魔术常量”检查机制(http://blog.jetbrains.com/idea/2012/02/new-magic-constant-inspection/)
    (我们不需要详细了解这个机制具体是如何实现的,想了解的话可以点击链接)。

    很多时候,我们使用整型常量代替枚举类型(性能考虑),例如我们有一个IceCreamFlavourManager类,它具有三种模式的操 作:VANILLA,CHOCOLATE和STRAWBERRY。我们可以定义一个名为@Flavour的新注解,并使用@IntDef指定它可以接受的 值类型。

    public class IceCreamFlavourManager {
        private int flavour;
        public static final int VANILLA = 0;
        public static final int CHOCOLATE = 1;
        public static final int STRAWBERRY = 2;
        @IntDef({VANILLA, CHOCOLATE, STRAWBERRY})
        public @interface Flavour {
        }
        @Flavour
        public int getFlavour() {
            return flavour;
        }
        public void setFlavour(@Flavour int flavour) {
            this.flavour = flavour;
        }
    }

    这时假如我们使用错误的整型值调用IceCreamFlavourManager.setFlavour时,IDE将报错如下:

    深入浅出Android Support Annotations

    IDE甚至会提示我们可以使用的有效的取值:

    深入浅出Android Support Annotations

    我们也可以指定整型值作为标志位,也就是说这些整型值可以使用’|’或者’&’进行与或等操作。假如我们把@Flavour定义为如下标志位:

    @IntDef(flag = true, value = {VANILLA, CHOCOLATE, STRAWBERRY})
    
        public @interface Flavour {
    
    }

    那么可以如下调用:

    iceCreamFlavourManager.setFlavour(IceCreamFlavourManager.VANILLA & IceCreamFlavourManager
    
                    .CHOCOLATE);

    @StringDef用法和@IntDef基本差不多,只不过是针对String类型而已。

    关于将来计划增加哪些新的注解类型或者这些注解的依赖以及和Intellij自身的注解如何交互等等问题,可以查看网址:http://tools.android.com/tech-docs/support-annotations。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    SQL汉字转换为拼音的函数

    windows 7系统无法运行Photoshop CS3的解决方法

    巧用MySQL加密函数对Web网站敏感数据进行保护

    MySQL基础知识简介

    Windows7和WinXP下如何实现不输密码自动登录系统的设置方法介绍

    windows 7系统ip地址冲突怎么办?windows 7系统IP地址冲突问题的

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。