1. 配置
首先去git上下载jar包,一个是androidannotations.jar,一个是androidannotations-api.jar。
新建我们的Android工程,将androidannotations-api.jar放入libs目录中,然后新建一个目录compile-lib,将androidannotations放进取,右键我们的工程-->Properties-->Java Compiler-->Annotation
Processing-->勾选Enable project specific settings和底下的两个选择框,然后点击左侧Factory Path,添加我们刚才compile-lib中的jar包,即可。
2. 框架的使用
注意,使用AndroidAnnotation后,所有四大组件的名字后面都需要加一个"_"。
(1). @EActivity
在Activity的上面使用@符号即可添加注解,例如:
@EActivity(R.layout.activity_main) public class MainActivity extends Activity { <span style="white-space:pre"> </span>@ViewById(R.id.button1) <span style="white-space:pre"> </span>Button button; <span style="white-space:pre"> </span>@Override <span style="white-space:pre"> </span>protected void onCreate(Bundle savedInstanceState) { <span style="white-space:pre"> </span>super.onCreate(savedInstanceState); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>@Click(R.id.button1) <span style="white-space:pre"> </span>public void startAcitvity() { <span style="white-space:pre"> </span>startActivity(new Intent(MainActivity.this, SecondActivity_.class)); <span style="white-space:pre"> </span>} }
看出来可以很方便的省去我们之前的findViewById方法。
(2). @EService
新建一个Service:
@EService public class MyService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("THR", "onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { return null; } }
和Activity的差不多:
@Click(R.id.button1) public void startService() { startService(new Intent(this, MyService_.class)); }
注意都需要在manifest文件中配置,不能忘记下划线"_"。
(3). @ViewById查找控件
@ViewById(R.id.textView1) TextView textView1; @ViewById(R.id.textView2) TextView textView2; @AfterViews public void setTextView() { textView1.setText("Text1"); textView2.setText("Text2"); }
如果不指定ViewById后面的id的话,它会默认的去寻找和我们变量名一致的id,如果找到则可以正常运行,找不到就会报空指针的异常。
(4). @ViewsById查找多个控件
还有一种方法使用ViewsById:
@ViewsById({ R.id.textView1, R.id.textView2 }) List<TextView> list; @AfterViews public void setTextView() { list.get(0).setText("Text1"); list.get(1).setText("Text2"); }
同样很简单。
(5). @Click点击事件
<span style="white-space:pre"> </span>@ViewById(R.id.textView1) <span style="white-space:pre"> </span>TextView textView1; <span style="white-space:pre"> </span>@ViewById <span style="white-space:pre"> </span>TextView textView2; <span style="white-space:pre"> </span>@Click({ R.id.textView1, R.id.textView2 }) <span style="white-space:pre"> </span>public void showToast() { <span style="white-space:pre"> </span>Toast.makeText(this, "点击事件", 1).show(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>@AfterViews <span style="white-space:pre"> </span>public void setTextView() { <span style="white-space:pre"> </span>textView1.setText("TextView1"); <span style="white-space:pre"> </span>textView2.setText("TextView2"); <span style="white-space:pre"> </span>}
使用@Click注解,还可以给多个View添加点击事件。
@LongClick的使用和这个差不多,这里就不做介绍了。
(6). @Extra可以方便传递参数
第一个Activity中:
public static final String NAME = "name"; public static final String AGE = "age"; @Click(R.id.button1) public void startActivity() { Intent intent = new Intent(this, SecondActivity_.class); intent.putExtra(NAME, "Jerry"); intent.putExtra(AGE, 27); startActivity(intent); }
SecondActivity中:
@Extra(MainActivity.NAME) String name; @Extra(MainActivity.AGE) int age; @ViewById(R.id.name_view) TextView nameView; @ViewById(R.id.age_view) TextView ageView; @AfterViews public void initView() { nameView.setText(name); ageView.setText(age + ""); }
(7). @ItemClick、@ItemLongClick和@Touch
这个主要用在ListView上:
@ViewById(R.id.listView) ListView listView; @ItemClick(R.id.listView) public void listViewItemClick(int p) { Toast.makeText(this, p + "good", 0).show(); }
ItemLongClick和这个使用方法类似。
(8). @Background处理后台任务的方法
@Background public void doSomething() { Log.i("THR", "Background线程id" + Thread.currentThread().getId()); } @Click(R.id.button1) public void startActivity() { doSomething(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("THR", "MainActivity线程id" + Thread.currentThread().getId()); }
通过运行发现,这个方法是运行在子线程中的。
(9). @UiThread
修改代码:
@Background public void doSomething() { Log.i("THR", "Background线程id" + Thread.currentThread().getId()); updateUi(); } @UiThread public void updateUi() {<pre name="code" class="java"><pre name="code" class="java"> Log.i("THR", "updateUi线程id" + Thread.currentThread().getId());
textView1.setText("更新UI");}
可以使得更新UI的操作在主线程中调用,不会报异常。
(10). @StringRes获取资源文件中的String
@StringRes(R.string.name) String name;
还有@DimensionRes的使用都类似:
@DimensionRes(R.dimen.activity_horizontal_margin) double size;
(11). @WindowFeature窗口样式
无标题样式:
@WindowFeature({ Window.FEATURE_NO_TITLE, Window.FEATURE_INDETERMINATE_PROGRESS }) @EActivity(R.layout.activity_main) public class MainActivity extends Activity {
4. 查看Activity_
右键工程-->Java Compiler-->Annotation Processing-->Generated source directory:-->去掉apt_generated前面的点。
5. 总结
在使用这个框架的时候要注意以下几点:
(1). 注册同名的Activity_
(2). View的修饰不能为private的
(3). 注解注释的方法和字段不能是private的
Log.i("THR", "Background线程id" + Thread.currentThread().getId());
版权声明:本文为博主原创文章,未经博主允许不得转载。