android注解支持颜色,Android support-annotations 注解使用详解

Android 注解库依赖

Android-support-library 引入了新的注解库,包含很多有用的元注解,可以用来修饰代码提示。如果使用了 v4、v7、appcompat 的库,则内部已经引用过下面的依赖。

implementation 'com.android.support:support-annotations:28.0.0'

注解库元注解说明

依赖了上述 Android 注解库后,就可以使用下面的元注解了。

资源注解

@StringRes

用于指出一个 integer 的参数、成员变量或方法返回值是一个 string 资源的引用。示例:

//成员变量

@StringRes

int userId;

//参数

public void setUserId(@StringRes int userId) {

}

//方法返回值

public @StringRes int getUserId(){

// return R.string.app_name;

return userId;

}

举个例子,当 @StringRes 用作参数限定时,参数为 int 类型,正确情况下只能传 R.string.xx,如下图:

2c0cf9f09a47

@StringRes

如果直接传 int 数值,编译器会发出警告以提醒开发者注意编码的正确性。注意:即使编译器发出警告,仍然能忽略警告直接编译运行项目。

下面的代码是来自另一注解库的写法, android-support-annotations 并不支持,不要弄混。

@StringRes(R.string.text_name)

String text;

来自依赖库:

annotationProcessor 'org.androidannotations:androidannotations:4.4.0'

implementation 'org.androidannotations:androidannotations-api:4.4.0'

相似的,资源注解还支持以下资源类型:

@AnimatorRes、@AnimRes、@AnyRes、@ArrayRes、@AttrRes、@BoolRes、@ColorRes、@DimenRes、@DrawableRes、@FractionRes、@IdRes、@IntegerRes、@InterpolatorRes、@LayoutRes、@MenuRes、@PluralsRes、@RawRes、@StyleableRes、@StyleRes、@TransitionRes、@XmlRes

颜色注解

@ColorInt

用于指出被注解的元素是一个 int 颜色值,表示的是 AARRGGBB。

线程注解

指定方法运行在特定线程中。

@MainThread:被注解的方法应该只在主线程中被调用。

@WorkerThread:被注解的方法应该只在工作线程中被调用。

@UiThread:被注解的方法应该只在 UI 线程中被调用。

但是实际测试发现对于 @MainThread、@UiThread 俩个注解 ide 没有给出很好的警号,下面是图示,有知道原因的同学欢迎留言。

方法定义:

@MainThread

public void testMainThread(){

}

@UiThread

public void testUiThread(){

}

@WorkerThread

public void testWorkerThread(){

}

测试结果:

2c0cf9f09a47

@xxxThread

空注解

@Nullable 用来标记参数或返回值可以为 null;

@NonNull 用来标记参数或返回值不能为 null;

@NonNull

String nullString = "test";

public void testNull(@Nullable String key){

}

public @Nullable String testNull(){

return null;

}

public void testNonNull(@NonNull String key){

}

public @NonNull String testNonNull(){

return "test";

}

当出现错误使用时,会出现下面的黄色背景警告:

2c0cf9f09a47

@NonNull

但是需要注意,即使上述示例中出现了警告,也仍然能编译通过,所以 @Nullable、@NonNull 并非是安全的,它仅是编码时的一种提示。

样式注解

@IntDef @StringDef

相当于替换枚举。

@IntDef({SpecType.TYPE_ONE, SpecType.TYPE_TWO, SpecType.TYPE_THREE})

@Retention(RetentionPolicy.SOURCE)

public @interface SpecType {

int TYPE_ONE = 1;

int TYPE_TWO = 2;

int TYPE_THREE = 3;

}

//示例

public void setSpecType(@SpecType int type) {

}

同样,错误情况下,存在下划线警告仍然能编译通过,注解仅仅用来提示开发者编码的正确性,并非绝对安全。

值域注解

@Size @IntRange @FloatRange

指定元素的数值范围。

使用:

public void setValue(@IntRange(from = 0, to = 10) int v) {

}

public void setSize(@Size(min = 1) int v) {

//int 最小为 1

}

public void setSize(@Size(max = 5) String s) {

//string 的长度最大为 5

}

public void setSize(@Size(min = 1) List l) {

//集合至少有一个元素

}

public void setSize(@Size(2) int[] arr) {

//数组只能有俩个元素

}

测试结果:

2c0cf9f09a47

@xxxRange

测试发现 @IntRange 中,对于 int、集合,ide 没有给出正确的警告(也可能是理解、测试方式有误?),有清楚原因的小伙伴欢迎留言。

权限注解

@RequiresPermission

声明一个方法需要的权限。

@RequiresPermission(Manifest.permission.INTERNET)

public void testPermission(){

}

当 AndroidManifest 没有配置相应权限时会下划线警告。

重写注解

@CallSuper

用于提示重写的父类方法也必须调用。

使用:

public class Father {

@CallSuper

public void test(){

}

}

测试结果:

2c0cf9f09a47

@CallSuper

混淆注解

@Keep

保证代码不被混淆

总结

注解有以下三种类型:

类型

效果

用途

RetentionPolicy.Source

源码注解,Java 编译成 class 时注解被遗弃。

编码时检测,如 @Nullable

RetentionPolicy.CLASS

注解保留到 class 文件,但 JVM 加载 class 时遗弃,是默认生命周期。

编译时处理,如EventBus 3.0 编译时注解

RetentionPolicy.RunTime

注解在运行时仍然存在。

动态注解,如 EventBus 2.0,或枚举替代

Android support-annotations 注解库更多的作用是协调开发(即上述源码注解或编译时注解),注解可以给予协作者一定的代码提示,使用它制定开发规则,以提升协作开发下代码的健壮性。另外需要注意的是,注解并非像 Java 强类型校验一样安全,即使存在告警也能编译通过并运行,所以兼容代码仍然需要。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值