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的声明,多添加了下划线“_”