AndroidAnnotations 使用

Stella981
• 阅读 637

下面部分是基于2.6上使用的注解和解释

AfterInject 定义的方法在类的构造方法执行后执行
AfterTextChange 定义的方法在TextView及其子类的Text属性改变后执行
AfterViews 定义的方法在setContentView后执行
Background 定义的方法在后台线程执行
BeforeTextChange 定义的方法在TextView及其子类的Text属性改变前执行
Click 定义点击监听器
EActivity 在Activity中启用Annotations
EProvider 在 ContentProvider中启用Annotations
EReceive 在BroadcastReceiver中启用Annotations
EService 在Service中启用Annotations
EView 在自定义的View的子类中启用Annotations
Fullscreen 全屏
NoTitle 无标题

3.0

中增加了

EFragment 对Fragment的支持

还有官网上给出的Rest GET (我猜想这是个请求还没试过)

以下方法在本人并不知道在2.6里面是否存在。

@Transactional 数据库查询注释。必要参数SQLiteDatabase

添加该注释的方法中可以直接写对应的sql方法。至于对数据库的事务处理则在之后生成的文件中会帮你处理

@ItemClick 即 OnItemClickListener

listItemClicked(int position) position则就是当前的item的position

如果传递的类型不是int 那么则调用parent.getAdapter().getItem(position) 强制转换

@ItemSelect 即 OnItemSelectedListener

必须包含一个boolean参数,额外最多再增加一个参数

@ItemLongClick即OnItemLongClickListener

与ItemClick 同理

@StringArrayRes 即获得array的资源参数

@StringRes 获取string参数

@ColorRes 获取color参数

@BooleanRes 获取bool参数

@SystemService  获取getSystemService的参数

@UiThread(delay = 100) 延迟100毫秒后执行

@Extra(MY_STRING_EXTRA) 即 Bundle extras_ = getIntent().getExtras();

if(extras_.containsKey(MY_STRING_EXTRA))

xx = extras_.getString(MY_STRING_EXTRA);

注意点:

第一关于注解类的引用:

如果大伙打开我们项目可以看到.apt_generated这样一个文件,这里面就是存放我们注解后生成的最终类文件。

我们可以打开看到最后的生成的类都是final。这是3.0后才增加的,所以不支持我们的注解类是抽象的。(PS:抽象类,小样的,你还打算让我框架牛逼到几个意思帮你实现抽象方法啊~)

我们在AndroidManifest.xml中注册的activity,service则都在缘有类的后面增加"_"如:将LoginActivity类头顶增加了@EActivity,那么在AndroidManifest.xml中注册的类则是:LoginActivity_ 当然包名是原先的一样的。当然这样之后我们在一个activity中打开另外一个activity则也是打开他最终的生成类(如:LoginActivity_)由于eclipse的毛病不少所以有的时候我们直接引用LoginActivity_ 这样类会失败,所以有网友提供一个反射方法来提取该类方法如下:

public class GeneratedClassUtils {

    @SuppressWarnings("rawtypes")
    public static Class get(Class clazz) {

        if (clazz == null) {
            return null;
        }
        if (clazz.getCanonicalName().endsWith("_")) {
            return clazz;
        }

        String name = clazz.getCanonicalName() + "_";

        try {
            Class result = Class.forName(name);
            return result;
        } catch (ClassNotFoundException e) {
            new RuntimeException("Cannot find class for" + name, e);
        }

        return null;
    }
}

第二关于命名。

由于你的注解类会通过AndroidAnnotations生成一个最终类,所以当你在很愉快的写 @ViewId @Click的时候,AndroidAnnotations会在你的最终类里面默默的写下hasViews.findViewById(id.layout_top_bar_right).这是多好助手,但是你在使用的同时也应当注意,这里面使用到id.xxx这id原本引用的是R.id。那如果我们在我们的注解类上写个非private的id呢~这时候就会提示我们空指针异常了。所以第二点必须注意,尽量少在注解类使用 id命名的参数,如果需要使用请使用private 形容。

目前掌握的内容就这么多。

以后有时间会不定期更新~

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
@TableLogic表逻辑处理注解(逻辑删除)
在字段上加上这个注解再执行BaseMapper的删除方法时,删除方法会变成修改例:实体类:@TableLogicprivateIntegerdel;service层:调用BaseMapper的deleteById(id);执行是效果:加@TableLogic的情况下走Update
Wesley13 Wesley13
3年前
Java日期时间API系列30
  实际使用中,经常需要使用不同精确度的Date,比如保留到天2020042300:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyyMMdd),然后再解析为Date。Java8中可以用更多的方法来实现这个需求,下面使用三种方法:使用Format方法、 使用Of方法和使用With方法,性能对比,使用
Stella981 Stella981
3年前
CI等MVC框架中为什么不能有index控制器的原因
因为类名称是index而方法又是index,这样index函数就是php4中的构造函数,即实例化类时,直接执行这个函数而没有执行父类的构造函数,也就没有初始化CI核心类。所以会提示没有定义属性或方法了。用index类名也可以,在publicfunctionindex()方法前加上,调用父类的构造方法publicfunction\_\
京东云开发者 京东云开发者
9个月前
一次因PageHelper引起的多线程复用问题的排查和解决 | 京东物流技术团队
A、ProblemDescription1\.PageHelper方法使用了静态的ThreadLocal参数,在startPage()调用紧跟MyBatis查询方法后,才会自动清除ThreadLocal存储的对象。2\.当一个线程先执行了A方法的PageH