Android Annotations浅析

来源:互联网 发布:群晖1517端口转发教程 编辑:程序博客网 时间:2024/06/03 16:27

这阵子遇到了好多事情,挺久没来更新博文了,这两天在学这个开源框架Android Annotations,用起来感觉挺方便的,

相信用过Spring注解的孩子理解起来应该比较容易!就是配置起来比较吃力。

关于AndroidAnnotaions的介绍,网上已经很多了,我这里不再累赘。

  1、AndroidAnnotations官网:http://androidannotations.org/(也许你需要翻墙)

  2、eclipse中使用androidannotations的配置方法说明:https://github.com/excilys/androidannotations/wiki/Eclipse-Project-Configuration

  3、Android Studio中配置AndroidAnnotations:(这个是我这篇博文中要涉及到的!)


一、Android Studio配置androidannotations环境。

1、首先你建立一个module之后,在对应的app中会有一个名为build.gradle的文件(该module有效),而在整个项目外面也会有一个名为build.gradle的文件(全局有效)【这个工具中的application的目录下(相当于Eclipse下的workspace)是可以有多个module的(相当于Eclipse下的project)】

2、我们配置的时候大概要分为下面两步

在局部build.gradle中(加入红色字体部分):

apply plugin: 'com.android.application'
apply plugin: 'android-apt'
def AAVersion = '3.0.1'



android {
    compileSdkVersion 19
    buildToolsVersion "20.0.0"


    defaultConfig {
        applicationId "com.tongbu.mytest"
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'

    apt "org.androidannotations:androidannotations:$AAVersion"
    compile "org.androidannotations:androidannotations-api:$AAVersion"

}


apt {
    arguments {
        androidManifestFile variant.processResources.manifestFile
        resourcePackageName 'com.tongbu.mytest'
    }
}


在全局build.gradle中(加入红色字体部分):

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.12.+'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.3'
    }
}


allprojects {
    repositories {
        jcenter()
    }
}


如果以上的都顺利完成了,那么恭喜你已经快配置完了,还需要把AndroidManifest.xml中的Activity的名字后面加上 _(下划线),因为这个框架解析编译的时候,比如类MainActivity会被解析成MainActivity_.class,所以在清单文件中我们要在Activity的名字后面加一个下划线,或者androidannotation会报错!

但并不会这么顺利,在你补充完下划线之后,你会发现会提示你找不到MainActivity_这个东东

那么怎么办呢??我们说了它是在编译的时候整出来的,那我们只要按一下编译的按钮即可生成了!!



这样子androidannotation在android studio上的环境就配置好了,Eclipse的话资料比较多,再这里就不介绍了


二、一个Demo来了解androidannotations的部分注解

[java] view plain copy
 print?
  1. @NoTitle  //无标题  
  2. @Fullscreen //全屏  
  3. @EActivity(R.layout.activity_my)  
  4. public class MyActivity extends ActionBarActivity {  
  5.     //==============================================基本的注解=================================================  
  6.     @ViewById  
  7.     Button button1;  
  8.   
  9.     @ViewById  
  10.     Button button2;  
  11.   
  12.     @ViewById(R.id.textview1)   //指定id的注入  
  13.     TextView textView;  
  14.   
  15.     @ViewById  
  16.     ProgressBar progressBar;  
  17.   
  18.     @ViewById  
  19.     ImageView imageView;  
  20.   
  21.     //获取系统service的方法(取代原来的clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);)  
  22.     @SystemService  
  23.     ClipboardManager clipboardManager;  
  24.   
  25.     @Click({R.id.button1,R.id.button2,R.id.button3,R.id.button4})  
  26.     public void simpleButtonOnClicked(View view){  
  27.         switch (view.getId()){  
  28.             case R.id.button1:{  
  29.                 textView.setText("Button1 is Clicked!");  
  30.             }  
  31.             break;  
  32.             case R.id.button2:{  
  33.                 textView.setText("Button2 is Clicked!");  
  34.             }  
  35.             break;  
  36.             case R.id.button3:{  
  37.                 String content = clipboardManager.getText().toString();  
  38.                 Toast.makeText(getApplicationContext(),"剪贴板内容: " + content, Toast.LENGTH_SHORT).show();  
  39.             }  
  40.             break;  
  41.             case R.id.button4:{  
  42.                 Toast.makeText(getApplicationContext(),"滚动条开始了!",Toast.LENGTH_SHORT).show();  
  43.                 progressBarWorks();  
  44.             }  
  45.             break;  
  46.         }  
  47.     }  
  48.   
  49.   
  50.     @LongClick({R.id.button2})  
  51.     public void buttonOnLongClicked(View view){  
  52.         switch (view.getId()){  
  53.             case R.id.button1:{  
  54.                 textView.setText("Button1 is LongClicked!");//由于没注册,所以不可能被触发  
  55.             }  
  56.             break;  
  57.             case R.id.button2:{  
  58.                 textView.setText("Button2 is LongClicked!");//可触发  
  59.             }  
  60.             break;  
  61.         }  
  62.     }  
  63.   
  64.     //===================================================关于资源的注解=========================================  
  65.   
  66.     @AnimationRes(R.anim.rotate)  
  67.     Animation animationRotate;  
  68.   
  69.     @DrawableRes(R.drawable.myphoto)  
  70.     Drawable myphoto;  
  71.   
  72.     @ColorRes(R.color.love)  
  73.     Integer mycolor;  
  74.   
  75.     @TextRes(R.string.textres)  
  76.     CharSequence text;  
  77.   
  78.     @Click({R.id.button5,R.id.button6,R.id.button7})  
  79.     public void animationButtonOnClicked(View view){  
  80.         switch (view.getId()){  
  81.             case R.id.button5:{  
  82.                 imageView.startAnimation(animationRotate);  
  83.             }  
  84.             break;  
  85.             case R.id.button6:{  
  86.                 imageView.setImageDrawable(myphoto);  
  87.             }  
  88.             break;  
  89.             case R.id.button7:{  
  90.                 Toast.makeText(getApplicationContext(),text.toString(),Toast.LENGTH_SHORT).show();  
  91.             }  
  92.             break;  
  93.         }  
  94.     }  
  95.   
  96.     //==============================================关于线程的注解================================================  
  97.     //相当于一个新的任务AsyncTask或者新线程Thread  
  98.     @Background  
  99.     public void progressBarWorks(){  
  100.         //相当于一个新的线程中执行: @Background  
  101.         int i = 1;  
  102.         while (i <= 10){  
  103.             Log.e("progress","进度: " + i);  
  104.             try {  
  105.                 Thread.sleep(1000);  
  106.                 updateProgressBar(i);  
  107.                 //直接progressBar.setProgress(i);也可以的,所以@Background注解内部可能实现了handler机制  
  108.                 i++;  
  109.             } catch (InterruptedException e) {  
  110.                 e.printStackTrace();  
  111.             }  
  112.         }  
  113.   
  114.     }  
  115.   
  116.     //指代UI线程  
  117.     @UiThread  
  118.     public void updateProgressBar(int i){  
  119.         progressBar.setProgress(i);  
  120.         if (i == 10){  
  121.             Toast.makeText(getApplicationContext(), "滚动条结束",Toast.LENGTH_SHORT).show();  
  122.         }  
  123.     }  
  124.   
  125.     //=======================================关于几个事件的先后顺序===============================================  
  126.   
  127.     @Override  
  128.     protected void onCreate(Bundle savedInstanceState) {  
  129.         super.onCreate(savedInstanceState);  
  130.         Log.e("FirstToLast""onCreate");  
  131.   
  132.         //可省略!  
  133.         //setContentView(R.layout.activity_my);  
  134.   
  135.         //progressBar.setMax(100);  报错,空指针异常  
  136.         //因为在onCreate()被调用的时候,@ViewById还没有被set,也就是都为null  
  137.         //所以如果你要对组件进行一定的初始化,那么你要用@AfterViews注解  
  138.     }  
  139.   
  140.     @AfterViews  
  141.     public void init(){  
  142.         Log.e("FirstToLast","init");  
  143.         progressBar.setMax(10);  
  144.     }  
  145.   
  146.     @Override  
  147.     protected void onResume() {  
  148.         super.onResume();  
  149.         Log.e("FirstToLast","onResume");  
  150.     }  
  151.   
  152.     @Override  
  153.     protected void onStart() {  
  154.         super.onStart();  
  155.         Log.e("FirstToLast","onStart");  
  156.     }  
  157.   
  158.   
  159. }  


几个方法的先后调用顺序:



资源涉及的注解(不一一列举):

0 0
原创粉丝点击