在使用Java的SSH框架的时候,一直在感叹注解真是方便啊,关于注解的原理,大家能够參考我的还有一片文章Java注解具体解释

近期有时间研究了android注解的使用,今天与大家分享一下。

android中注解的使用用到了GitHub上的开源框架androidannotations,下载地址。这个开源框架应该是眼下使用人数最多的android注解框架了,主要是由于它设计的注解标签很多。能够满足我们日常开发中的大部分需求。androidannotations将很多能够抽取出来的方法都包装成了注解标签供我们使用,一会我会给大家具体演示。

好了。言归正传,我们一起来看看怎么使用这个东东。


第一步

下载androidannotations

下载之后解压文件,我们会看到有两个jar包:


第二步

在eclipse上配置框架:

1.新建一个android项目,把androidannotations-api-3.2.jar复制到libs目录中,同一时候在项目中新建一个目录,叫做compile-lib,把androidannotations-3.2.jar文件拷贝进去。如图:



2.选中项目,右键单击。选择Properties。在新窗体左边能够看到Java Compiler,选中Java Compiler下的Annotation Processin。然后选中右边的Enable project specific Settings,同意给项目一些特殊设置。

如图:



3.展开Annotation Processin。选中Factory Path,然后点击右边的Enable project specific Settings。最后点击Add JARs,加入jar包。如图:

4.选中我们刚刚新建目录中的jar包。一路点击OK就可以,如图

好了,至此我们的开发环境上的配置就完毕了


第三步

測试配置是否成功

在一个Activity上输入@E,看看提示什么:

假设你看到了@EActivity。那么恭喜你,配置成功。假设没有看到,请检查以上步骤。

如图:


第四步

配置好了。接下来我们就要看看怎么使用androidannotations了。

1.Activity注解的使用

改动清单文件里的activity配置。我们要在MainActivity后面加入一个_:

        <activity
android:name=".MainActivity_"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

至于为什么要把MainActivity改为MainActivity_。我在后面会给大家解释。然后在MainActivity上加入注解:

@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

删除掉onCreate()方法中的setContentView(R.layout.activity_main);,如图:

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}

为了方便起见,我们先在主布局文件里加入一些控件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.example.androidannotations.MainActivity" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1" /> <Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button2" /> <Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button3" /> <Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button4" />
<Button
android:id="@+id/button5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Go TO Next Activity" />
<Button
android:id="@+id/button6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="多线程事件" /> <TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" /> <TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" /> <TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" /> </LinearLayout>

这个时候我们执行看看。在没有给Activity设置布局的情况下系统有没有报错:

没有崩溃,全部内容正常显示。由此可见@EActivity(R.layout.activity_main)取代了setContentView(R.layout.activity_main);,这个使用起来更加方便。

再介绍一个和Activity有关的注解。我们在Activity使用过程中,常常须要又一次自己定义标题栏,从而须要隐藏系统默认的标题栏。那么这个该怎么实现呢:

@WindowFeature({ Window.FEATURE_NO_TITLE , Window.FEATURE_INDETERMINATE_PROGRESS})
@EActivity(R.layout.activity_main)
public class MainActivity extends Activity {

效果图:



标题栏成功隐藏。比我们其它的隐藏标题的方式都方便吧。

2.实例化控件注解

实例化控件注解是androidannotations中又一个很好用的注解。也攻克了我们开发过程中最枯燥的一项工作,正常情况下,我们实例化一个控件要使用findViewById,拿到控件后再强转为我们须要的类型,代码量大。并且枯燥,那么看看androidannotations带给我们什么惊喜呢?

我们的主布局文件上一共同拥有四个TextView,我使用下面三种方式来进行实例化:

    @ViewById(R.id.textView1)
TextView tv1; @ViewById
TextView textView2; @ViewsById({R.id.textView3,R.id.textView4})
List<TextView> list;

第一种:@ViewById(R.id.textView1)这是很标准的写法。声明一个控件之后。然后使用@ViewById注解。在注解中说明这个控件的id,这样相当于取代了这样一行代码:

TextView tv1 = (TextView) this.findViewById(R.id.textView1);

另外一种:我没有指明这个注解标签要用的id,那么它是怎么实例化的呢?在没有指明的情况下,androidannotations会使用控件名作为id。我的第二个控件名叫做textView2。与xml中的布局id是一样的,因此能够不用在注解中指定id.

第三种:假设要声明多个控件,能够把这些控件放入一个List集合中,然后在注解中指明多个id就可以。

控件实例化之后,紧跟着就能够给控件赋值了:

    @AfterViews
public void initTextView(){
tv1.setText("hello world!");
textView2.setText("hello android annotations!");
for(TextView tv:list){
tv.setText("hello lenve!");
}
}

这种方法会在实例完控件后执行。

3.事件注解

我们开发中用的较多的事件androidannotations差点儿都给我们提供了注解:


@TextChange
@AfterTextChange
@BeforeTextChange
@EditorAction
@FocusChange
@CheckedChange
@Touch
@Click
@LongClick
@ItemClick
@ItemLongClick
@ItemSelect
@OptionsItem
@SeekBarProgressChange
@SeekBarTouchStart
@SeekBarTouchStop

我这里挑个简单的,也是最常常使用的说一下,算是抛砖引玉了:

    @Click({R.id.button1,R.id.button2,R.id.button3})
public void btn_click(View v){
switch (v.getId()) {
case R.id.button1:
Toast.makeText(this,"btn1", Toast.LENGTH_LONG).show();
break;
case R.id.button2:
Toast.makeText(this,"btn2", Toast.LENGTH_LONG).show();
break;
case R.id.button3:
Toast.makeText(this,"btn3", Toast.LENGTH_LONG).show();
break;
}
} @Click(R.id.button4)
public void btn4_click(){
Toast.makeText(this,"btn4", Toast.LENGTH_LONG).show();
}

在方法之上加入@Click注解。在注解中指明这是哪个控件的点击事件,假设是多个事件的点击事件,就注明多个id,在方法中使用v.getId()方法来进行区分。

假设仅仅给一个控件设置点击事件,那看button4的样例。

事件的注解事实上是比較简单的,我就不多说了。大家有兴趣能够查看官方文档

4.线程注解

这大概是最让我激动的一个注解了。这里主要给大家介绍两个注解:

@Background
@UiThread

毫无疑问,@Background是让方法在子线程中执行,而@UiThreaad则是让方法在UI线程中执行。

我们来实现一个简单的效果。点击一个按钮之后。让一个TextView自己主动更新值。

    @Background
public void doInBackground(){
try {
for (int i = 0; i < 100; i++) {
tvShowNumber(i);
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} @UiThread
public void tvShowNumber(int i) {
list.get(1).setText(i+"");
}

首先,在doInBackground方法中,每隔1秒执行一次tvShowNumber(i);方法。这种方法假设在主线程中执行会导致ANR异常,所以必须在子线程中执行,可是android中有不同意在子线程中更新UI线程。所以我们要在tvShowNumber方法上加入@UiThread标签,表明该方法是在UI线程中执行的。

看看效果图:

这里彻底抛弃了烦人的Message、Handler(此处该有掌声)。

5.Activity之间传值注解

Activity之间的跳转常常须要数据的传递。在新的Activity中须要通过Bundle来获得这些数据,还要推断是否为空。很麻烦,看看androidannotations是怎么解决问题的:

新建一个SecondActivity,注意要改动清单文件,在文件后面加上_:

        <activity
android:name=".SecondActivity_"
android:label="@string/title_activity_second" >
</activity>

SecondActivity接收MainActivity传来的两个參数,一个是name,一个是address。我们先来看看MainActivity中的代码:

    @Click(R.id.button5)
public void go2NextActivity(){
//这里要注意第二个Activity的写法
Intent intent = new Intent(this,SecondActivity_.class);
intent.putExtra("name", "张三");
intent.putExtra("address", "xi'an");
startActivity(intent);
}

在SecondActivity中获得MainActivity中传来的值:

    @Extra("name")
String username;
@Extra
String address;

和上文一样。假设參数名同样。则不用在注解中说明參数名称,否则要指明。这样就自己主动拿到MainActivity中传来的值了。假设MainActivity中传来的值为空,也不会报错,系统会自己主动处理异常情况。

6.资源文件注解

资源文件的使用我们也能够使用注解,比方。在strings.xml中加入一个字符串:

<string name="welcome">hello China,Hello xi\'an and guangzhou</string>

在程序中我们要引用这个值:

@StringRes(R.string.welcome)
String welcome;

这样welcome就自己主动获得了这里的值。

注意@StringRes导入的包是import org.androidannotations.annotations.res.StringRes;,不是android自带的包,别上当了。

效果图:

7关于加_的原因

最后再解决一个问题,就是什么要在清单文件里加_。要回答这个问题请大家先选中项目,右键单击,取消apt_generated前面的一个点。



取消之后,我们的项目里多了一个目录:

这里的目录中的Activity就是我们刚才新建的Activity。仅仅只是都多了一个下划线,我们打开这些Activity看看:

我们通过注解写的布局文件。它又在这里给我们生成了,所以说,我们终于编译时用的是这里的文件,这也是为什么清单文件里要加下划线了。


注意事项

最后强调一个注意事项,凡是使用注解的代码,一定不要用private修饰最多能够用protected修饰。由于androidannotations在使用注解生成真正的源代码时,假设我们的东东被private修饰了,它就没法调用这些东西了,所以最多仅仅能用protected修饰。


关于androidannotations的很多其它使用方法大家能够參考官方文档


好了,关于Androidannotations的使用就给大家介绍到这里,有什么问题请留言。本项目源代码下载


android注解使用具体解释(图文)的更多相关文章

  1. android注解使用详解(图文)

    在使用Java的SSH框架的时候,一直在感叹注解真是方便啊,关于注解的原理,大家可以参考我的另一片文章Java注解详解.最近有时间研究了android注解的使用,今天与大家分享一下. android中 ...

  2. Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架

    前言: Annotation注解在Android的开发中的使用越来越普遍,例如EventBus.ButterKnife.Dagger2等,之前使用注解的时候需要利用反射机制势必影响到运行效率及性能,直 ...

  3. Android注解使用之使用Support Annotations注解优化代码

    前言: 前面学习总结了Java注解的使用,博客地址详见Java学习之注解Annotation实现原理,从本质上了解到什么注解,以及注解怎么使用?不要看见使用注解就想到反射会影响性能之类,今天我们就来学 ...

  4. Java Android 注解(Annotation) 及几个常用开源项目注解原理简析

    不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...

  5. 使用Android Studio搭建Android集成开发环境(图文教程)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  6. Android注解支持(Support Annotations)

    注解支持(Support Annotations) Android support library从19.1版本开始引入了一个新的注解库,它包含很多有用的元注解,你能用它们修饰你的代码,帮助你发现bu ...

  7. android布局属性具体解释

    RelativeLayout用到的一些重要的属性: 1:LinearLayout ( 线性布局 ) (里面仅仅能够有一个控件,而且不能设计这个控件的位置,控件会放到左上角) 线性布局分为水平线性和垂直 ...

  8. Android Notification通知详细解释

    Android Notification通知具体解释  Notification: (一).简单介绍:         显示在手机状态栏的通知. Notification所代表的是一种具有全局效果的通 ...

  9. Android注解框架实战-ButterKnife

    文章大纲 Android注解框架介绍 ButterKnife实战 项目源码下载   一.框架介绍 为什么要用注解框架?  在Android开发过程中,我们经常性地需要操作组件,操作方法有findVie ...

随机推荐

  1. RabbitMQ~消息的产生和管理(15672)

    上一讲说了rabbitmq在windows环境的部署,而今天主要说一下消息在产生后,如何去查看消息,事实上,rabbitmq为我们提供了功能强大的管理插件,我们只要开启这个插件即可,它也是一个网站,端 ...

  2. ZUK Z2 Pro(Z2121) 免解锁BL 免rec Magisk Xposed ROOT 救砖 ZUI 4.0.247

    >>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后用 ...

  3. [Windows Server 2008] SQL Server 2008 数据库还原方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:还原SQL S ...

  4. mvc EF 出现异常, 能提示出那个字段出现问题

    } catch (DbEntityValidationException ex) { message = "添加异常"; desc = " {" + ex.Me ...

  5. vsftpd:500OOPS:vsftpd:refusingtorunwithwritablerootinsidechroot()错误的解决方法

    当我们限定了用户不能跳出其主目录之后,使用该用户登录FTP时往往会遇到这个错误: 500 OOPS: vsftpd: refusing to run with writable root inside ...

  6. java aop面向切面编程

    最近一直在学java的spring boot,一直没有弄明白aop面向切面编程是什么意思.看到一篇文章写得很清楚,终于弄明白了,原来跟python的装饰器一样的效果.http://www.cnblog ...

  7. ESP、EBP、CALL 指令与局部变量浅析

    概述 函数调用是计算机程序中一个最重要的概念之一,从汇编的角度看,能更加直观地理解函数调用的原理,理解 CALL 指令调用过程中 ESP.EBP 寄存器的作用. 我们先从一段简陋的 C 语言代码说起, ...

  8. JavaScript 复杂判断的优雅写法

    JavaScript 复杂判断的优雅写法 <div> <input type="button" name="btn" value=" ...

  9. 总结这几天js的学习内容

    对js中难点的理解 1.把变量对象像遍历数组一样简单 对于数组 ,迭代出来的是数组元素,对于对象 ,迭代出来的是对象的属性: var obj = { w: "wen", j: &q ...

  10. 51nod1006 -最长公共子序列Lcs【动态规划】

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). 比如两个串为: abcicba abdkscab ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最 ...