截个图,大概annotations 包中有40个注解,看名称一般就知道是干什么的了,
这个是 support-annotations-23.1.1 中的所有的注解,
===================另外一个开源的注解框架=================================
这个开源的名称是 androidannotations-api, 不是官方的,名字很像.
官方网站 : http://androidannotations.org/, 有个对比前,对比后, 效果很诱人,想试试.
这里是在Android Studiozhong的配置,
http://blog.csdn.net/caiwenfeng_for_23/article/details/45801151
有一些注意的就是, 对Activity的注解之后, 需要在Activity后面加上"_",清单中对Activity注册也要加上"_"
然后就是被人吐槽的Rest Api ,应该只支持简单的联网处理, 复杂的用这个就不行了,
然后这里还有一个出bug 的问题,
http://blog.csdn.net/caiwenfeng_for_23/article/details/47681161
然后这儿有个一系列教程,2天了,终于找到一个系列了,这个相当详细了:
http://zhenhappy.github.io/2015/10/11/Android-Annotations-1-Introduce.html
http://zhenhappy.github.io/2015/10/12/Android-Annotations-2-Eclipse.html
http://zhenhappy.github.io/2015/10/13/Android-Annotations-3-Android-Studio.html
http://zhenhappy.github.io/2015/10/20/Android-Annotations-4-@EActivity.html
http://zhenhappy.github.io/2015/11/05/Android-Annotations-5-@ViewById-@ViewsById.html
http://zhenhappy.github.io/2015/11/07/Android-Annotations-6-@Click.html
http://zhenhappy.github.io/2015/11/29/Android-Annotations-7-Threading.html
然后,这个页面包含了绝大部分注解的详情:
http://www.csdn123.com/html/topnews201408/29/729.htm
粘贴过来:
@EActivity
@EActivity(R.layout.main)
public class MyActivity extends Activity {}
@fragment
@EFragment(R.layout.my_fragment_layout)
public class MyFragment extends Fragment {}
注册:
<fragment
android:id="@+id/myFragment"
android:name="com.company.MyFragment_"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
创建:
MyFragment fragment = new MyFragment_();
@EBean
普通类:
@EBean
public class MyClass {}
注意:这个类必须仅仅只能有一个构造函数,参数最多有一个context。
Activity中使用:
@EActivity
public class MyActivity extends Activity {
@EBean
MyOtherClass myOtherClass;
}
也可以用来声明接口:
@EBean(MyImplementation.class)
MyInterface myInterface;
@RootContext
在普通类中还可以注入根环境:
@EBean
public class MyClass {
@RootContext
Context context;
// Only injected if the root context is an activity
@RootContext
Activity activity;
// Only injected if the root context is a service
@RootContext
Service service;
// Only injected if the root context is an instance of MyActivity
@RootContext
MyActivity myActivity;
}
@AfterInject
如果想在类创建时期做一些操作可以:
@AfterInject
public void doSomethingAfterInjection() {
// notificationManager and dependency are set
}
scope
单例类需要如下声明:
@EBean(scope = Scope.Singleton)
public class MySingleton {}
注意:在单例类里面不可以注入view和事件绑定,因为单例的生命周期比Activity和Service的要长,以免发生内存溢出。
@EView
@EViewpublic class CustomButton extends Button {
@App
MyApplication application;
@StringRes
String someStringResource;
public CustomButton(Context context, AttributeSet attrs) {
super(context, attrs);
}}
注册:
<com.androidannotations.view.CustomButton_
android:layout_width="match_parent"
android:layout_height="wrap_content" />
创建:
CustomButton button = CustomButton_.build(context);
@EViewGroup
@EViewGroup(R.layout.title_with_subtitle)
public class TitleWithSubtitle extends RelativeLayout {
@ViewById
protected TextView title, subtitle;
public TitleWithSubtitle(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setTexts(String titleText, String subTitleText) {
title.setText(titleText);
subtitle.setText(subTitleText);
}
}
注册:
<com.androidannotations.viewgroup.TitleWithSubtitle_
android:id="@+id/firstTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
@EApplication
@EApplication
public class MyApplication extends Application {}
@EApplication
public class MyApplication extends Application {}
Activity中使用:
@EActivity
public class MyActivity extends Activity {
@App
MyApplication application;}
@EService
@EServicepublic class MyService extends Service {}
跳转service:
MyService_.intent(getApplication()).start();
停止service:
MyService_.intent(getApplication()).stop();
@EReceiver
@EReceiverpublic class MyReceiver extends BroadcastReceiver {}
@Receiver
可以替代声明BroadcastReceiver
@EActivitypublic class MyActivity extends Activity {
@Receiver(actions = "org.androidannotations.ACTION_1")
protected void onAction1() {
}}
@EProvider
@EProviderpublic class MyContentProvider extends ContentProvider {}
@ViewById
@EActivitypublic class MyActivity extends Activity {
// Injects R.id.myEditText,变量名称必须和布局的id名称一致
@ViewById
EditText myEditText;
@ViewById(R.id.myTextView)
TextView textView;}
@AfterViews
@EActivity(R.layout.main)public class MyActivity extends Activity {
@ViewById
TextView myTextView;
@AfterViews
void updateTextWithDate() {//一定要在这里进行view的一些设置,不要在oncreate()中设置,因为oncreate()在执行时 view还没有注入 myTextView.setText("Date: " + new Date()); }[...]
@StringRes
@EActivitypublic class MyActivity extends Activity {
@StringRes(R.string.hello)
String myHelloString;//不能设置成私有变量
@StringRes
String hello;}
@ColorRes
@EActivitypublic class MyActivity extends Activity {
@ColorRes(R.color.backgroundColor)
int someColor;
@ColorRes
int backgroundColor;}
@AnimationRes
@EActivitypublic class MyActivity extends Activity {
@AnimationRes(R.anim.fadein)
XmlResourceParser xmlResAnim;
@AnimationRes
Animation fadein;}
@DimensionRes
@EActivitypublic class MyActivity extends Activity {
@DimensionRes(R.dimen.fontsize)
float fontSizeDimension;
@DimensionRes
float fontsize;}
@DImensionPixelOffsetRes
@EActivitypublic class MyActivity extends Activity {
@DimensionPixelOffsetRes(R.string.fontsize)
int fontSizeDimension;
@DimensionPixelOffsetRes
int fontsize;}
@DimensionPixelSizeRes
@EActivitypublic class MyActivity extends Activity {
@DimensionPixelSizeRes(R.string.fontsize)
int fontSizeDimension;
@DimensionPixelSizeRes
int fontsize;}
其他的Res:
@BooleanRes
@ColorStateListRes
@DrawableRes
@IntArrayRes
@IntegerRes
@LayoutRes
@MovieRes
@TextRes
@TextArrayRes
@StringArrayRes
@Extra
@EActivitypublic class MyActivity extends Activity {
@Extra("myStringExtra")
String myMessage;
@Extra("myDateExtra")
Date myDateExtraWithDefaultValue = new Date();}
或者:
@EActivity
public class MyActivity extends Activity {
// The name of the extra will be "myMessage",名字必须一致
@Extra
String myMessage;}
传值:
MyActivity_.intent().myMessage("hello").start() ;
@SystemService
@EActivitypublic class MyActivity extends Activity {//
@SystemService
NotificationManager notificationManager;}
@HtmlRes
@EActivitypublic class MyActivity extends Activity {
// Injects R.string.hello_html
@HtmlRes(R.string.hello_html)
Spanned myHelloString;
// Also injects R.string.hello_html
@HtmlRes
CharSequence helloHtml;}
@FromHtml
@EActivity
public class MyActivity extends Activity {//必须用在TextView
@ViewById(R.id.my_text_view)
@FromHtml(R.string.hello_html)
TextView textView;
// Injects R.string.hello_html into the R.id.hello_html view
@ViewById
@FromHtml
TextView helloHtml;}
@NonConfigurationInstance
public class MyActivity extends Activity {//等同于 Activity.onRetainNonConfigurationInstance()
@NonConfigurationInstance
Bitmap someBitmap;
@NonConfigurationInstance
@Bean
MyBackgroundTask myBackgroundTask;}
@HttpsClient
@HttpsClientHttpClient httpsClient;
示例:
@EActivity
public class MyActivity extends Activity {
@HttpsClient(trustStore=R.raw.cacerts,
trustStorePwd="changeit",
hostnameVerif=true)
HttpClient httpsClient;
@AfterInject
@Background
public void securedRequest() {
try {
HttpGet httpget = new HttpGet("https://www.verisign.com/");
HttpResponse response = httpsClient.execute(httpget);
doSomethingWithResponse(response);
} catch (Exception e) {
e.printStackTrace();
}
}
@UiThread
public void doSomethingWithResponse(HttpResponse resp) {
Toast.makeText(this, "HTTP status " + resp.getStatusLine().getStatusCode(), Toast.LENGTH_LONG).show();
}}
@FragmentArg
@EFragmentpublic class MyFragment extends Fragment {//等同于 Fragment Argument
@FragmentArg("myStringArgument")
String myMessage;
@FragmentArg
String anotherStringArgument;
@FragmentArg("myDateExtra")
Date myDateArgumentWithDefaultValue = new Date();}
MyFragment myFragment = MyFragment_.builder()
.myMessage("Hello")
.anotherStringArgument("World")
.build();
@Click
@Click(R.id.myButton)void myButtonWasClicked() {
[...]}@Clickvoid anotherButton() {//如果不指定则函数名和id对应
[...]}@Clickvoid yetAnotherButton(View clickedView) {
[...]}
其他点击事件:
Clicks with
@Click
Long clicks with
@LongClick
Touches with
@Touch
AdapterViewEvents
Item clicks with
@ItemClick
Long item clicks with
@ItemLongClick
Item selection with
@ItemSelect
有两种方式调用:
1.
@EActivity(R.layout.my_list)public class MyListActivity extends Activity {
// ...
@ItemClick
public void myListItemClicked(MyItem clickedItem) {//MyItem是adapter的实体类,等同于adapter.getItem(position)
}
@ItemLongClick
public void myListItemLongClicked(MyItem clickedItem) {
}
@ItemSelect
public void myListItemSelected(boolean selected, MyItem selectedItem) {
}}
2.
@EActivity(R.layout.my_list)public class MyListActivity extends Activity {
// ...
@ItemClick
public void myListItemClicked(int position) {//位置id
}
@ItemLongClick
public void myListItemLongClicked(int position) {
}
@ItemSelect
public void myListItemSelected(boolean selected, int position) {
}}
@SeekBarProgressChange
//等同于SeekBar.OnSeekBarChangeListener.onProgressChanged(SeekBar, int, boolean)
@SeekBarProgressChange(R.id.seekBar)
void onProgressChangeOnSeekBar(SeekBar seekBar, int progress, boolean fromUser) {
// Something Here
}
@SeekBarProgressChange(R.id.seekBar)
void onProgressChangeOnSeekBar(SeekBar seekBar, int progress) {
// Something Here
}
@SeekBarProgressChange({R.id.seekBar1, R.id.seekBar2})
void onProgressChangeOnSeekBar(SeekBar seekBar) {
// Something Here
}
@SeekBarProgressChange({R.id.seekBar1, R.id.seekBar2})
void onProgressChangeOnSeekBar() {
// Something Here
}@SeekBarTouchStart and @SeekBarTouchStop
@SeekBarTouchStart 和 @SeekBarTouchStop
接受开始和结束事件的监听
@TextChange
@TextChange(R.id.helloTextView)
void onTextChangesOnHelloTextView(CharSequence text, TextView hello, int before, int start, int count) {
// Something Here
}
@TextChange
void helloTextViewTextChanged(TextView hello) {
// Something Here
}
@TextChange({R.id.editText, R.id.helloTextView})
void onTextChangesOnSomeTextViews(TextView tv, CharSequence text) {
// Something Here
}
@TextChange(R.id.helloTextView)
void onTextChangesOnHelloTextView() {
// Something Here
}
@BeforeTextChange
@BeforeTextChange(R.id.helloTextView)
void beforeTextChangedOnHelloTextView(TextView hello, CharSequence text, int start, int count, int after) {
// Something Here
}
@BeforeTextChange
void helloTextViewBeforeTextChanged(TextView hello) {
// Something Here
}
@BeforeTextChange({R.id.editText, R.id.helloTextView})
void beforeTextChangedOnSomeTextViews(TextView tv, CharSequence text) {
// Something Here
}
@BeforeTextChange(R.id.helloTextView)
void beforeTextChangedOnHelloTextView() {
// Something Here
}
@AfterTextChange
@AfterTextChange(R.id.helloTextView)
void afterTextChangedOnHelloTextView(Editable text, TextView hello) {
// Something Here
}
@AfterTextChange
void helloTextViewAfterTextChanged(TextView hello) {
// Something Here
}
@AfterTextChange({R.id.editText, R.id.helloTextView})
void afterTextChangedOnSomeTextViews(TextView tv, Editable text) {
// Something Here
}
@AfterTextChange(R.id.helloTextView)
void afterTextChangedOnHelloTextView() {
// Something Here
}
@OptionsMenu和OptionsItem
@EActivity@OptionsMenu(R.menu.my_menu)public class MyActivity extends Activity {
@OptionMenuItem
MenuItem menuSearch;
@OptionsItem(R.id.menuShare)
void myMethod() {
// You can specify the ID in the annotation, or use the naming convention
}
@OptionsItem
void homeSelected() {
// home was selected in the action bar
// The "Selected" keyword is optional
}
@OptionsItem
boolean menuSearch() {
menuSearch.setVisible(false);
// menuSearch was selected
// the return type may be void or boolean (false to allow normal menu processing to proceed, true to consume it here)
return true;
}
@OptionsItem({ R.id.menu_search, R.id.menu_delete })
void multipleMenuItems() {
// You can specify multiple menu item IDs in @OptionsItem
}
@OptionsItem
void menu_add(MenuItem item) {
// You can add a MenuItem parameter to access it
}}
或者:
@EActivity@OptionsMenu({R.menu.my_menu1, R.menu.my_menu2})public class MyActivity extends Activity {}
@Background
执行:
void myMethod() {
someBackgroundWork("hello", 42);}@Backgroundvoid someBackgroundWork(String aParam, long anotherParam) {
[...]}
取消:
void myMethod() {
someCancellableBackground("hello", 42);
[...]
boolean mayInterruptIfRunning = true;
BackgroundExecutor.cancelAll("cancellable_task", mayInterruptIfRunning);}@Background(id="cancellable_task")void someCancellableBackground(String aParam, long anotherParam) {
[...]}
非并发执行:
void myMethod() {
for (int i = 0; i < 10; i++)
someSequentialBackgroundMethod(i);}@Background(serial = "test")void someSequentialBackgroundMethod(int i) {
SystemClock.sleep(new Random().nextInt(2000)+1000);
Log.d("AA", "value : " + i);}
延迟:
@Background(delay=2000)void doInBackgroundAfterTwoSeconds() {}
@UiThread
UI线程:
void myMethod() {
doInUiThread("hello", 42);}@UiThreadvoid doInUiThread(String aParam, long anotherParam) {
[...]}
延迟:
@UiThread(delay=2000)void doInUiThreadAfterTwoSeconds() {}
优化UI线程:
@UiThread(propagation = Propagation.REUSE)void runInSameThreadIfOnUiThread() {}
进度值改变:
@EActivitypublic class MyActivity extends Activity {
@Background
void doSomeStuffInBackground() {
publishProgress(0);
// Do some stuff
publishProgress(10);
// Do some stuff
publishProgress(100);
}
@UiThread
void publishProgress(int progress) {
// Update progress views
}}
@OnActivityResult
@OnActivityResult(REQUEST_CODE)
void onResult(int resultCode, Intent data) {
}
@OnActivityResult(REQUEST_CODE)
void onResult(int resultCode) {
}
@OnActivityResult(ANOTHER_REQUEST_CODE)
void onResult(Intent data) {
}
@OnActivityResult(ANOTHER_REQUEST_CODE)
void onResult() {
}
以上的注释用法基本包含了平常程序中的事件绑定,用AndroidAnnotations框架可以专注于做逻辑开发,最主要是简化代码编写,容易维护。
如有问题可以参考官方文档https://github.com/excilys/androidannotations/wiki/Cookbook,
来源:oschina
链接:https://my.oschina.net/u/988826/blog/605652