来源 https://juejin.im/entry/58fc7ca744d9040069e65197 日常开发中,注解能够帮助我们写出更好更优秀的代码,为了更好地支持 Android 开发,在已有的android.annotation基础上,Google开发了android.support.annotation扩展包,共计50个注解,帮助开发者们写出 AndroID 注解
日常开发中,注解能够帮助我们写出更好更优秀的代码,为了更好地支持 @L_403_1@ 开发,在已有的 androID.annotation 基础上,Google 开发了 androID.support.annotation 扩展包,共计50个注解,帮助开发者们写出更优秀的程序。
官网链接:developer.android.google.cn/reference/a…、developer.android.google.cn/reference/a…
| 注解名 | 释义 | 修饰类型 |
|---|
| AnimatorRes | 用于描述一个整型的参数或字段,或者是一个期望返回 animator 资源引用的方法(例如:androID.R.animator.fade_in) | 参数、字段、方法 |
| AnimRes | 用于描述一个整型的参数或字段,或者是一个期望返回 anim 资源引用的方法(例如:androID.R.anim.fade_in) | 参数、字段、方法 |
| AnyRes | 用于描述一个整型的参数或字段,或者是一个期望返回任意资源引用的方法 | 参数、字段、方法 |
| AnyThread | 被注解的元素可以在任意线程被调用 | 方法、构造器、类、接口、枚举 |
| ArrayRes | 用于描述一个整型的参数或字段,或者是一个期望返回 array 资源引用的方法(例如:androID.R.array.phoneTypes) | 参数、字段、方法 |
| AttrRes | 用于描述一个整型的参数或字段,或者是一个期望返回 attr 资源引用的方法(例如:androID.R.attr.action) | 参数、字段、方法 |
| BinderThread | 用于描述一个方法、构造器、类、接口、枚举应该运行在 binder 线程 | 方法、构造器、类、接口、枚举 |
| BoolRes | 用于描述一个整型的参数或字段,或者是一个期望返回 boolean 资源引用的方法 | 参数、字段、方法 |
| CallSuper | 用于描述子类方法,希望它们重写父类方法时也要通过 super.() 调用父类方法 | 方法 |
| CheckResult | 用于描述一个方法,如果它的返回值被忽略了,那么就会报错 | 方法 |
| ColorInt | 用于描述一个整型的参数或字段,或者是一个期望返回 int 类型颜色值的方法 | 参数、字段、方法 |
| ColorLong | 用于描述一个整型的参数或字段,或者是一个期望返回 long 类型颜色值的方法 | 参数、字段、方法 |
| ColorRes | 用于描述一个整型的参数或字段,或者是一个期望返回 color 资源引用的方法(例如:androID.R.color.black) | 参数、字段、方法 |
| DimenRes | 用于描述一个整型的参数或字段,或者是一个期望返回 dimension 资源引用的方法(例如:androID.R.dimen.app_icon_size) | 参数、字段、方法 |
| Dimension | 用于描述一个整型的参数或字段,或者是一个期望返回 dimension 的方法 | 参数、字段、方法、注解 |
| DrawableRes | 用于描述一个整型的参数或字段,或者是一个期望返回 drawable 资源引用的方法(例如:androID.R.attr.alertDialogIcon) | 参数、字段、方法 |
| FloatRange | 描述一个参数、字段或方法的返回值是一个指定范围内的 float 或 double 类型的值 | 参数、字段、方法 |
| FractionRes | 用于描述一个分数类型的参数或字段,或者是一个期望返回 fraction 资源引用的方法 | 参数、字段、方法 |
| Halffloat | 用于描述一个半精度类型的参数或字段,或者是一个期望返回半精度值的方法 | 参数、字段、方法 |
| IdRes | 用于描述一个整型的参数或字段,或者是一个期望返回 ID 资源引用的方法(例如:androID.R.ID.copy) | 参数、字段、方法 |
| IntDef | 用于描述一个注解,然后再用这个被描述的注解去描述一个整形的参数或字段,或者是一个期望返回值是显示声明常量之一的方法 | 注解 |
| IntegerRes | 用于描述一个整型的参数或字段,或者是一个期望返回 integer 资源引用的方法(例如:androID.R.integer.config_shortAnimTime) | 参数、字段、方法 |
| InterpolatorRes | 用于描述一个整型的参数或字段,或者是一个期望返回 integer 资源引用的方法(例如:androID.R.interpolator.cycle) | 参数、字段、方法 |
| IntRange | 描述一个参数、字段或方法的返回值是一个指定范围内的 int 类型的值 | 参数、字段、方法 |
| Keep | 被注解的元素不会被混淆 | 包、参数、字段、方法、类、接口、枚举、注解、构造器 |
| LayoutRes | 用于描述一个整型的参数或字段,或者是一个期望返回 layout 资源引用的方法(例如:androID.R.layout.List_content) | 参数、字段、方法 |
| MainThread | 被注解的元素只能在主线程被调用 | 方法、构造器、类、接口、枚举 |
| MenuRes | 用于描述一个整型的参数或字段,或者是一个期望返回 menu 资源引用的方法(例如:androID.R.menu.content) | 参数、字段、方法 |
| NonNull | 用于描述一个参数或字段、或者一个方法的返回值不为空 | 参数、字段、方法 |
| Nullable | 用于描述一个参数或字段、或者一个方法的返回值可为空 | 参数、字段、方法 |
| PluralsRes | 用于描述一个整型的参数或字段,或者是一个期望返回 plurals 资源引用的方法(例如:androID.R.plurals.ph) | 参数、字段、方法 |
| Px | 用于描述一个整型的参数或字段,或者是一个期望返回像素尺寸的方法 | 参数、字段、方法 |
| RawRes | 用于描述一个整型的参数或字段,或者是一个期望返回 raw 资源引用的方法(例如:androID.R.raw.ph) | 参数、字段、方法 |
| RequiresApi | 被注解的元素只能在被给的 API 版本或更高情况下才能被调用 | 类、接口、枚举、方法、构造器、字段 |
| RequiresPermission | 被注解的元素需要或者可能需要一个或多个权限 | 注解、方法、构造器、字段 |
| RequiresPermission.Read | | |
| RequiresPermission.Write | | |
| RestrictTo | 被注解的元素只能在特定的范围内被访问 | 注解、类、接口、枚举、方法、构造器、字段、包 |
| Size | 被注解的元素需要提供其大小或长度 | 参数、字段、方法、注解 |
| StringDef | 用于描述一个注解,然后再用这个被描述的注解去描述一个 string 类型的参数或字段,或者是一个期望返回值是显示声明常量之一的方法 | 注解 |
| StringRes | 用于描述一个整型的参数或字段,或者是一个期望返回 string 资源引用的方法(例如:androID.R.string.ok) | 参数、字段、方法 |
| StyleableRes | 用于描述一个整型的参数或字段,或者是一个期望返回 styleable 资源引用的方法(例如:androID.R.styleable.TextVIEw_text) | 方法、参数、字段 |
| StyleRes | 用于描述一个整型的参数或字段,或者是一个期望返回 style 资源引用的方法(例如:androID.R.style.TextAppearance) | 方法、参数、字段 |
| TransitionRes | 用于描述一个整型的参数或字段,或者是一个期望返回 TransitionRes 资源引用的方法(例如:androID.R.Transition.fade) | 方法、参数、字段 |
| UiThread | 被注解的元素只能在主线程被调用 | 方法、构造器、类、接口、枚举 |
| WorkerThread | 被注解的元素只能在工作线程被调用 | 方法、构造器、类、接口、枚举 |
| XmlRes | 用于描述一个整型的参数或字段,或者是一个期望返回 xml 资源引用的方法(例如:androID.R.xml.test) | 参数、字段、方法 |
| SuppressLint | lint 静态检测工具将会忽略被注解元素的警告 | 类、字段、方法、参数、构造器 |
| TargetApi | lint 静态检测工具将会以指定 API 版本对待被注解元素 | 类、接口、枚举、方法、构造器 |
@H_616_419@示例详解AnimatorRes1.在 res 文件夹下创建 animator 子文件夹
2.在 animator 文件夹下创建 scale.xml 文件
<set xmlns:androID="http://schemas.androID.com/apk/res/androID"></set>
3.在需要的地方如下调用:
@AnimatorRespublic int returnAnimator() { return R.animator.scale;}
如果将 return R.animator.scale; 改成 return 1; 或 return R.string.test; 等均会报错。
AnimRes1.在 res 文件夹下创建 anim 子文件夹
2.在 anim 文件夹下创建 scale.xml 文件
<set xmlns:androID="http://schemas.androID.com/apk/res/androID"></set>
3.在需要的地方如下调用:
@AnimRespublic int returnAnim() { return R.anim.scale;}
如果将 return R.anim.scale; 改成 return 1; 或 return R.string.test; 等均会报错。
AnyRes在需要的地方如下调用:
@AnyRespublic int returnAny() { return 1;}
如果能提前知道返回值的具体资源类型,建议将 AnyRes 换成具体的资源类型,如 StringRes 或 DrawableRes 等。
AnyThread在需要的地方如下调用:
@AnyThreadpublic voID test() { //.....}
ArrayRes1.在 values 文件夹下创建 arrays.xml 文件
2.在 arrays.xml 文件中添加名为 names 的子项
<resources> <array name="names">1, 2, 3</array></resources>
3.在需要的地方如下调用:
@ArrayRespublic int returnArray() { return R.array.names;}
如果将 return R.array.names; 改成 return 1; 或 return R.string.test; 等均会报错。
AttrRes1.在 attrs.xml 文件中添加名为 CircleVIEw 的子项
<resources> <declare-styleable name="CircleVIEw"> <attr name="circle_color" format="color"/> </declare-styleable></resources>
2.在需要的地方如下调用:
@AttrRespublic int returnAttr() { return R.attr.circle_color;}
如果将 return R.attr.circle_color; 改成 return 1; 或 return R.string.test; 等均会报错。
BinderThread1.表明指定的元素只能运行在 Binder 线程:
@BinderThreadpublic voID test() { // ...}
BoolRes1.在 values 文件夹下创建 bools.xml 文件
2.在 bools.xml 文件中添加名为 isHIDe 的子项
<resources> <bool name="isHIDe">true</bool></resources>
3.在需要的地方如下调用:
@BoolRespublic int returnBool() { return R.bool.isHIDe;}
如果将 return R.bool.isHIDe; 改成 return 1; 或 return R.string.test; 等均会报错。
CallSuper1.在 BaseActivity 中创建一个 init() 方法,我们在其中初始化一些 Activity 共有的初始化 *** 作:
public class BaseActivity extends AppCompatActivity { // ... @CallSuper public voID init() { // Activity 共有的初始化 *** 作... }}
2.在具体 Activity 中继承 BaseActivity 并调用 init() 完成初始化 *** 作:
public class MainActivity extends BaseActivity { // ... @OverrIDe public voID init() { // super.init(); }}
如果在 init() 方法中不通过 super.init() 等方式调用父类方法,那么就会报一个 warning,编译器将会建议你调用 super.init()。
CheckResult1.创建一个 add() 方法:
@CheckResultpublic int add() { return 666;}
2.调用该方法的地方不能忽略它的返回值:
add(); // errorint num = add(); // ok
colorIntcolorLongcolorRes1.在 colors.xml 下添加名为 colorAccent 的子项
<resources> <color name="colorAccent">#FF4081</color></resources>
2.在需要的地方如下调用:
@colorRespublic int returncolorRes() { return R.color.colorAccent;}
如果将 return R.color.colorAccent; 改成 return 1; 或 return R.string.test; 等均会报错。
DimenRes1.在 dimens.xml 下添加名为 textvIEw_height 的子项
<resources> <dimen name="textvIEw_height">25dp</dimen></resources>
2.在需要的地方如下调用:
@DimenRespublic int returnDimenRes() { return R.dimen.textvIEw_height;}
如果将 return R.dimen.textvIEw_height; 改成 return 1; 或 return R.string.test; 等均会报错。
Dimension1.在需要的地方如下调用:
@Dimension(unit = Dimension.DP)public int returnDimenRes() { return 666;}
注:该注解仅表明希望该方法返回的是一个 DP 的值,而返回值本身和 DP 无关
DrawableRes1..在 drawable.xml 文件中添加名为 btn_test 的子项
<selector xmlns:androID="http://schemas.androID.com/apk/res/androID"> <item androID:drawable="@drawable/btn_focused" androID:state_window_focused="true"/> <item androID:drawable="@drawable/btn_normal"/></selector>
3.在需要的地方如下调用:
@DrawableRespublic int returnDrawRes() { return R.drawable.btn_test;}
如果将 return R.drawable.btn_test; 改成 return 1; 或 return R.string.test; 等均会报错。
floatRange1.用该注解所标记的元素只能返回指定范围内的浮点型数字,例如:
@floatRange(from = -0.5F, to = 0.5F)public float returnfloat() { // return 0.8F; // error return 0.2F; // ok}
FractionRes同 ColorRes 等。
IDRes同 ColorRes 等。
IntDef1.用该注解修饰一个注解:
@IntDef({LAST, Now, NEXT})@Retention(RetentionPolicy.soURCE)public @interface Year { int LAST = 2016; int Now = 2017; int NEXT = 2018;}
2.再用被修饰的注解去注解指定元素:
@Yearpublic int returnYear() { // return 666; // warning return Year.LAST; // ok}
IntegerRes同 BoolRes 等。
InterpolatorRes同 ColorRes 等。
IntRange同FloatRange
Keep1.对于不希望被混淆的代码我们使用该注解:
@Keeppublic voID test() { // ...}
LayoutRes同 ColorRes 等。
MainThread同 BinderThread,表指定元素只能运行在主线程。
MenuRes同 ColorRes 等。
NonNull1.如果被注解的元素不可以取空值的话,我们使用该注解:
public Intent start2Activity(@NonNull String data) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra("DATA", data); return intent;}
2.在调用该方法处如果我们传入 null 作为参数编译器将会给出 warning:
public voID test() { start2Activity(null); //warning,passing 'null' argument to paramter annotated as @NonNull}
Nullable同 NonNull,意义相反,表被注解的元素可为空。
PluralsRes同 BoolRes 等。
Px实际等同于 Dimension 中 unit 取 PX 时的意义。
RawRes同 BoolRes 等。
RequiresAPI1.当你使用的代码(例:API 11)不支持你当前所支持的最低版本(例:API 10)时,使用该注解注明:
@OverrIDeprotected voID onCreate(Bundle savedInstanceState) { getwindow().getDecorVIEw().setsystemUIVisibility(VIEw.SYstem_UI_FLAG_FulLSCREEN | VIEw.SYstem_UI_FLAG_HIDE_NAVIGATION | VIEw.SYstem_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main);}
2.getwindow().getDecorVIEw().setsystemUIVisibility(VIEw.SYstem_UI_FLAG_FulLSCREEN| VIEw.SYstem_UI_FLAG_HIDE_NAVIGATION | VIEw.SYstem_UI_FLAG_IMMERSIVE_STICKY); 所支持最低版本为 API 11,如果你的项目最低兼容到11以下的版本,那么编译器将会给出 warning,解决方法有三:
使用 RequiresAPI 注解:
@OverrIDe@RequiresAPI(API = Build.VERSION_CODES.HONEYCOMB)protected voID onCreate(Bundle savedInstanceState) { getwindow().getDecorVIEw().setsystemUIVisibility(VIEw.SYstem_UI_FLAG_FulLSCREEN | VIEw.SYstem_UI_FLAG_HIDE_NAVIGATION | VIEw.SYstem_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main);}
使用 Target 注解:
@OverrIDe@TargetAPI(Build.VERSION_CODES.HONEYCOMB)protected voID onCreate(Bundle savedInstanceState) { getwindow().getDecorVIEw().setsystemUIVisibility(VIEw.SYstem_UI_FLAG_FulLSCREEN | VIEw.SYstem_UI_FLAG_HIDE_NAVIGATION | VIEw.SYstem_UI_FLAG_IMMERSIVE_STICKY); super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main);}
使用 if 包裹相应代码块:
@OverrIDeprotected voID onCreate(Bundle savedInstanceState) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { getwindow().getDecorVIEw().setsystemUIVisibility(VIEw.SYstem_UI_FLAG_FulLSCREEN | VIEw.SYstem_UI_FLAG_HIDE_NAVIGATION | VIEw.SYstem_UI_FLAG_IMMERSIVE_STICKY); } super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main);}
注:网上大篇文章提到使用 RequiresAPI 或 Target 注解能够解决低版本兼容问题,实际上它只是作为一个对程序员的提醒,告诉程序员这块代码只有在指定版本及以上才能使用,而并不是也不能用来解决兼容问题,指定代码块在低于指定版本上是不会运行的!
RequiresPermission1.表注解的元素需要相应的权限:
@RequiresPermission(Manifest.permission.INTERNET)private voID netoperation() {}
2.如果你的项目没有在 AndroIDMenifest.xml 中声明相应的权限,那么调用该方法的地方将会抛出 Missing permissions required by MainActivity.netoperation:androID.permission.INTERNET warning,所以同样的,这个注解只是告诉程序员指定的元素需要某个权限,而不代表使用了该注解后就不需要注册权限。
RequiresPermission.Read同 RequiresPermission。
RequiresPermission.Write同 RequiresPermission。
RestrictTo1.该注解用于想要指定访问元素权限的范围,例如我们在 BaseActivity 中对 init() 方法使用该注解:
@RestrictTo(RestrictTo.Scope.SUBCLASSES)public voID init() {}
2.这是限定了该方法只能由 BaseActivity 子类才能访问到,如果是非子类访问,则会被编译器抛出 BaseActivity.int() can only be called from subclass warning。
注:除 RestrictTo.Scope.SUBCLASSES 之外,还有其它几种枚举类型,详情可自行查看源码
Size1.常用于限定数组大小的场合:
public @Size(2) int[] returnArr() { int[] arr = new int[3]; int[] array = new int[2]; // return arr; // Size must be exactly 2. return array; // ok}
StringDef同 IntDef。
StringRes同 ColorRes 等。
StyleableRes同 ColorRes 等。
StyleRes同 ColorRes 等。
TransitionRes同 ColorRes 等。
UiThread同 BinderThread,表指定元素只能运行在 UI 线程。
WorkerThread同 BinderThread,表指定元素只能运行在工作线程。
XmlRes同 ColorRes 等。
Suppresslint1.在想要屏蔽 lint 静态检测工具的提示的地方添加该注解:
@Suppresslint("HandlerLeak")private Handler mHandler = new Handler(){ @OverrIDe public voID handleMessage(Message msg) { // ... }};
TargetAPI见 RequiresApi。
============= End
总结 以上是内存溢出为你收集整理的Android 注解指南全部内容,希望文章能够帮你解决Android 注解指南所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
赞
(0)打赏
微信扫一扫
支付宝扫一扫
评论列表(0条)