原文地址:http://blog.csdn.net/rain_butterfly/article/details/38731807


Android 最火的快速开发框架androidannotations配置详解

以前给大家介绍的xUtils是国内比较火的快速开发框架,但是它的注解机制不是太稳定而且注解可选也比较少,今天给大家介绍一个国外的一个框架主要专注于注解的开发,简化Android代码编写,因为配置注意事项较为复杂,所以先详细介绍一下配置:

git官网:https://github.com/excilys/androidannotations

Android 快速开发框架androidannotations详解_第1张图片

下载完解压目录如上,AndroidAnnotations是源码工程,example是例子工程,

打开\examples\HelloWorldEclipse,如下:

Android 快速开发框架androidannotations详解_第2张图片

复制 compile-libs文件夹到自己的工程根目录,打开libs文件夹 复制androidannotations-api-3.0.1.jar

到自己工程的libs文件夹下。如下:

Android 快速开发框架androidannotations详解_第3张图片

选中自己工程 project->properties->Java build path->libraries->add jars把androidannotations-api-3.0.1.jar添加进来

如下:


打开 Java compiler,选中enable project specific settings 设置compiler compliance level 1.6以上,如下:

Android 快速开发框架androidannotations详解_第4张图片

接着选中annotation processing选中enable annotation processing,如下:


接着展开annotation processing选中factory path->add jars 把compile-libs下的androidannotation-xxx.jar添加进来。如下:

Android 快速开发框架androidannotations详解_第5张图片

androidannotation-xxx.jar是工程编译文件,androidannotations-api-3.0.1.jar是api调用文件。

注意事项:

若需要混淆打包请在proguard-project.txt添加:-dontwarn org.springframework.**



=================华丽丽的分割线=================




Android 最火快速开发框架AndroidAnnotations使用详解

Android 最火的快速开发框架androidannotations配置详解文章中有eclipse配置步骤,Android 最火快速开发框架AndroidAnnotations简介文章中的简单介绍,本篇注重讲解AndroidAnnotations中注解方法的使用。

@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_();

普通类:

@EBeanpublic class MyClass {}


注意:这个类必须仅仅只能有一个构造函数,参数最多有一个context。

Activity中使用:

@EActivitypublic class MyActivity extends Activity {  @Bean  MyOtherClass myOtherClass;}

也可以用来声明接口:

@Bean(MyImplementation.class)    MyInterface myInterface;

在普通类中还可以注入根环境:

@EBeanpublic 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  public void doSomethingAfterInjection() {    // notificationManager and dependency are set  }

单例类需要如下声明:

@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

@EApplicationpublic class MyApplication extends Application {}

Activity中使用:
@EActivitypublic 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();}

或者:
@EActivitypublic 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
@EActivitypublic 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;

示例:
@EActivitypublic 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) {    [...]}

其他点击事件:
  • Clickswith@Click
  • Long clickswith@LongClick
  • Toucheswith@Touch

AdapterViewEvents

  • Item clickswith@ItemClick
  • Long item clickswith@ItemLongClick
  • Item selectionwith@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 和 @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,

更多相关文章

  1. Android 网络框架 android-async-http
  2. Android 中的 Activity Launch Mode 详解
  3. 详解Android aidl的使用方法
  4. Android Manifest.xml中的permission详解
  5. Shape的相关属性详解
  6. Android 3D游戏开发技术详解与典型案例
  7. Handler 使用方法详解
  8. Android程序开发的基本框架

随机推荐

  1. Invalidate和postInvalidate的区别
  2. 《深入解析Android(安卓)5.0系统》——导
  3. Flutter笔记(二)
  4. Android将胜过Windows Mobile五大原因
  5. android 问题总结
  6. Android(安卓)AOSP基础(三)Android系统源码
  7. android线性布局参数详解
  8. 在Windows中的安装Android(安卓)NDK开发
  9. 【Android】TextView的文字长度测量及各
  10. Android(安卓)Native 绘图方法