Android开源框架:AndroidAnnotations

AndroidAnnotations首页

github上的项目地址AndroidAnnotations Github

wiki:https://github.com/excilys/androidannotations/wiki/AvailableAnnotations

1、使用依赖注入(Dependency Injection)不熟悉的可以了解一下Inversion of Control(IoC)

2、简化的线程模型(Simplified  threading model)

3、事件绑定(Event binding)

4、REST Client

5、No Magic  [它的意思是:AndroidAnnotations在编译的时候会产生一个子类(接下来你会明白),你查看这个子类,可以看到它是如何工作的]

项目中重要的两个jar包分别是:androidannotations-api-3.0.1.jar和androidannotations-3.0.1.jar
2).新建一个android项目,然后将androidannotations-api-3.0.1.jar复制到libs目录下,在项目的根目录新建一个文件夹,命名为compile-libs,然后将androidannotations-3.0.1.jar复制到该目录下.

3).然后设置项目属性:右键->Properties->Java Compiler->Annotation Processing 在该页面选中Enable project specific settings。

4).然后点击Annotation Processing的子项Factory Path页面,选中Enable project specific settings,然后添加编译所需的jar包。点击“Add JARs”将之前complie-libs目录下的androidannotations-3.0.1.jar导入,保存后退出。

运用方式之布局文件xml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent"
 6     >
 7     <EditText
 8         android:id="@+id/myInput"
 9         android:layout_width="fill_parent"
10         android:layout_height="wrap_content"
11         />
12     <Button
13         android:id="@+id/myButton"
14         android:layout_width="fill_parent"
15         android:layout_height="wrap_content"
16         android:text="Click me!"
17         />
18     <TextView
19         android:id="@+id/myTextView"
20         android:layout_width="fill_parent"
21         android:layout_height="wrap_content"
22         />
23 </LinearLayout>

对应Activity的java文件:

 1 package com.example.testaa;
 2
 3 import org.androidannotations.annotations.AfterViews;
 4 import org.androidannotations.annotations.Click;
 5 import org.androidannotations.annotations.EActivity;
 6 import org.androidannotations.annotations.UiThread;
 7 import org.androidannotations.annotations.ViewById;
 8
 9 import android.app.Activity;
10 import android.content.Intent;
11 import android.widget.Button;
12 import android.widget.EditText;
13 import android.widget.TextView;
14 import android.widget.Toast;
15 @EActivity(R.layout.activity_main)
16 public class MainActivity extends Activity {
17     @ViewById(R.id.myInput)
18     EditText myEditText;
19
20     @ViewById
21     Button myButton;
22
23     @ViewById
24     TextView myTextView;
25     /**
26      * 加载完View之后进行的处理
27      */
28     @AfterViews
29     void afterViewProcess(){
30         myButton.setText("Next");
31         myTextView.setText("第一个Activity页面");
32     }
33
34     /**
35      * 绑定点击事件
36      */
37     @Click(R.id.myButton)
38     void processClick(){
39         Intent intent=new Intent(this,SubActivity_.class);
40         intent.putExtra("input_value", myEditText.getEditableText().toString());
41         startActivity(intent);
42     }
43
44     /**
45      * 利用UI线程显示一个Toast
46      * @param content
47      */
48     @UiThread
49     void showToast(String content){
50         Toast.makeText(getApplicationContext(), content, Toast.LENGTH_SHORT).show();
51     }
52     /**
53      * 延时显示
54      * @param content
55      */
56     @UiThread(delay=1000)
57     void showToastDelay(String content){
58         Toast.makeText(getApplicationContext(), content, Toast.LENGTH_SHORT).show();
59     }
60 }

可以看出,我们通过注解的方式,大大简化了原有的代码。

注解1:@ViewById 与findViewById功能相似,如果ViewById后没有设置资源ID的话,就是自动查找与变量名称相同的id资源(条件是控件变量名称要与xml中定义的id必须一致)。

但是这样会有一个问题,如果在Click()方法中调用,运行时就会报出:NullPointerException的错误,我们就不能在Click()方法中直接使用,而是要在@AfterView注释的方法中使用

注解2:@Click 点击事件处理的注解。

对于@Click,方法名和xml文件中的id一样就可以这样写,AndroidAnnotations会自动识别,对于多个Button,可以写多个@Click,也可以在这样:

@Click({R.id.button1,R.id.button2,R.id.button3})
void buttonClicked(Button bt){
    //TODO ...
}

注解3:@UiThread 后台Ui线程的注解,省去了Handler等等。

注解4:@EActivity 提示Activity的注解,注意,该注解将Activity编译成Activity_,注意,多一个下划线“_”,因此在AndroidManifest.xml文件中需要将其添加下滑线

原因:使用AndroidAnnotations,编译的时候会生成一个子类,这个子类的名称就是在原来的类之后加了一个下划线“_”,比如这个例子产生的子类名称为“MyActivity_”,这就需要你在注册这个Activity的时候,在AndroidManifest.xml中将 MyActivity 改为 MyActivity_ ,使用的时候也是使用MyActivity_来表示此类,如从另一个Activity跳转到此节目就要这样用:

注解5:@AfterViews 是指View类注入完毕之后执行的代码。

我们第二个页面的布局文件与第一个相同,我们主要看一下它的java文件:

package com.example.testaa;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Extra;
import org.androidannotations.annotations.UiThread;
import org.androidannotations.annotations.ViewById;

import android.app.Activity;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

@EActivity(R.layout.activity_sub)
public class SubActivity extends Activity{
    @ViewById(R.id.myInput)
    EditText myEditText;

    @ViewById
    Button myButton;

    @ViewById
    TextView myTextView;

    @Extra(value="input_value")
    String inputString;

    @AfterViews
    void afterViewProcess(){
        myTextView.setText(inputString);
    }

    @Click(R.id.myButton)
    void processClick(){
        showToast("Clicked me !");
    }

    @UiThread
    void showToast(String content){
        Toast.makeText(getApplicationContext(), content, Toast.LENGTH_SHORT).show();
    }
}

注:一个@Extra注解,这个注解的含义和getIntent().getExtra()相同,目的是获取上一个Activity通过Intent传递过来的值。

AndroidManifest.xml文件:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.testaa"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="17" />
10
11     <application
12         android:allowBackup="true"
13         android:icon="@drawable/ic_launcher"
14         android:label="@string/app_name"
15         android:theme="@style/AppTheme" >
16         <activity
17             android:name="com.example.testaa.MainActivity_"
18             android:label="@string/app_name" >
19             <intent-filter>
20                 <action android:name="android.intent.action.MAIN" />
21
22                 <category android:name="android.intent.category.LAUNCHER" />
23             </intent-filter>
24         </activity>
25         <activity
26             android:name="com.example.testaa.SubActivity_"></activity>
27     </application>
28
29 </manifest>

注意:Activity的声明,多添加了下划线“_”

时间: 2024-10-01 23:11:50

Android开源框架:AndroidAnnotations的相关文章

Android注解框架androidannotations简介

写程序的目的当然是为了给用户提供产品及服务,写程序是辛苦的,有时要加班加点,要抓破头皮等.在写程序的过程中,我们应该尽量让开发工作变得更轻松,更有味.我们能做的每一件事就是尽量减少代码量,不要重复造轮子.Android开源框架androidannotations(我简称AA框架)的目的正是于此,当然代码量减少了,不仅仅可以让工作更轻松,让读代码的人更轻松,维护代码更爽.正在开发的项目中,我们是用到了androidannotations注解框架,所以简单地讲讲: androidannotation

Android开源框架 Android-Universal-Image-Loader

Android开源框架Universal-Image-Loader就像图片加载守护者,为我们提供了丰富的功能特性: (1)多线程加载图像(异步或同步): (2)高度可定制化imageloader配置(线程池.图片下载器.解码器.内存和磁盘缓存.显示图像选项等): (3)每一个显示图像有许多自定义选项(存根图片,缓存开关,解码选项,位图处理和显示等): (4)支持内存和磁盘上的图像缓存(设备的文件系统和SD卡): (5)监听加载过程(包括下载进度): 下来我们详解如何配置使用Universal-I

Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解

本篇文章继续为大家介绍Universal-Image-Loader这个开源的图片加载框架,介绍的是图片缓存策略方面的,如果大家对这个开源框架的使用还不了解,大家可以看看我之前写的一篇文章Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用,我们一般去加载大量的图片的时候,都会做缓存策略,缓存又分为内存缓存和硬盘缓存,我之前也写了几篇异步加载大量图片的文章,使用的内存缓存是LruCache这个类,LRU是Least Recently Used 近

greenDao android开源框架数据库更新表的问题

最近使用greenDao当android应用升级数据库新增表或者修改表,发现数据被清空的问题 查找资料也没有找到解决方案,最后查看代码发现需要自己修改SQLiteOpenHelper 1.找到greenDao生成的DaoMaster.java文件,里面有SQLiteOpenHelper实现 2.修改DevOpenHelper类里的   public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 方法 通过old

Android开源框架ViewPageIndicator和ViewPager实现Tab导航

前言: 关于使用ViewPageIndicator和ViewPager实现Tab导航,在开发社区里已经有一堆的博客对其进行了介绍,假设我还在这里写怎样去实现.那简直就是老生常谈,毫无新奇感,并且.我也不觉得自己对ViewPageIndicator的理解会比别人好,毕竟我也是看着大神的帖子.在学习实践着. 那我还写这个有啥意义呢?事实上么,就是想在这里记录下.在使用ViewPageIndicator和ViewPager实现Tab导航时,大家有可能会遇到的坑.这个坑.须要我们开发时尽量去避免的. 啥

Android进阶笔记14:RoboBinding(实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架)

1.RoboBinding RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.从简单的角度看,他移除了如addXXListener(),findViewById()这些不必要的代码,连如BufferKnife那样的InjectView都不需要,因为你的代码一般不需要依赖于这些界面组件信息.下面以一个最简单的AndroidMVVM为例. (1)layout 布局 <LinearLayout xmlns:android="

android开源框架android-async-http使用

android开源框架android-async-http使用 转:http://www.open-open.com/lib/view/open1369637365753.html         android-async-http开源框架可以是我们轻松的获取网络数据或者向服务器发送数据,使用起来也很简单,下面做简单介绍,具体详细使用看官网:https://github.com/loopj/android-async-http 1.新建项目,去官网下载zip包,解压,打开releases文件,

Android开源框架Afinal第一篇——揭开圣女的面纱

Android开源框架Afinal第一篇——揭开圣女的面纱 分类: Android开源框架哪点事2013-09-02 14:25 260人阅读 评论(0) 收藏 举报 Afinal 这是Afinal在github的地址:https://github.com/yangfuhai/afinal Afinal这个框架主要分4块: 1.FinalDB模块:android中的orm框架,一行代码就可以进行增删改查.支持一对多,多对一等查询. 2.FinalActivity模块:android中的ioc框架

android 开源框架推荐

同事整理的 android 开源框架,个个都堪称经典.32 个赞! 1.volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)  JSON,图像等的异步下载: (2)  网络请求的排序(scheduling) (3)  网络请求的优先级处理 (4)  缓存 (5)  多级别取消请求 (6)  和Activity和生命周期的联动(Activity结束时同时取消所有网络请求) 2.android-async-http  项目地址:ht

Android 开源框架Universal-Image-Loader完全解析(三)---源代码解读

本篇文章主要是带大家从源码的角度上面去解读这个强大的图片加载框架,自己很久没有写文章了,感觉生疏了许多,距离上一篇文章三个月多了,确实是自己平常忙,换了工作很多东西都要去看去理解,然后加上自己也懒了,没有以前那么有激情了,我感觉这节奏不对,我要继续保持以前的激情,正所谓好记性不如烂笔头,有时候自己也会去翻看下之前写的东西,我觉得知识写下来比在脑海中留存的更久,今天就给大家来读一读这个框架的源码,我感觉这个图片加载框架确实写的很不错,读完代码自己也学到了很多.我希望大家可以先去看下Android