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

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

@EActivity

示例:

?
1
2
3
4
@EActivity (R.layout.main)
public class MyActivity extends Activity {
 
}
@fragment

示例:

?
1
2
3
<pre class = "brush:java;" > @EFragment (R.layout.my_fragment_layout)
public class MyFragment extends Fragment {
}</pre>
注册:
?
1
<fragment android:id= "@+id/myFragment" android:name= "com.company.MyFragment_" android:layout_width= "fill_parent" android:layout_height= "fill_parent" ></fragment>

创建:

?
1
MyFragment fragment = new MyFragment_();

普通类:

?
1
2
3
4
@EBean
public class MyClass {
 
}


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

Activity中使用:

?
1
2
3
4
5
6
7
@EActivity
public class MyActivity extends Activity {
 
   @Bean
   MyOtherClass myOtherClass;
 
}

也可以用来声明接口:

?
1
2
@Bean (MyImplementation. class )
     MyInterface myInterface;

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@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;
 
}

如果想在类创建时期做一些操作可以:

?
1
2
3
4
@AfterInject
   public void doSomethingAfterInjection() {
     // notificationManager and dependency are set
   }

单例类需要如下声明:

?
1
2
3
4
@EBean (scope = Scope.Singleton)
public class MySingleton {
 
}

注意:在单例类里面不可以注入view和事件绑定,因为单例的生命周期比Activity和Service的要长,以免发生内存溢出。

@EView

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@EView
public class CustomButton extends Button {
 
         @App
         MyApplication application;
 
         @StringRes
         String someStringResource;
 
     public CustomButton(Context context, AttributeSet attrs) {
         super (context, attrs);
     }
}


注册:

?
1
<com.androidannotations.view.custombutton_ android:layout_width= "match_parent" android:layout_height= "wrap_content" ></com.androidannotations.view.custombutton_>

创建:

?
1
CustomButton button = CustomButton_.build(context);


@EViewGroup

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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);
     }
 
}

注册:

?
1
<com.androidannotations.viewgroup.titlewithsubtitle_ android:id= "@+id/firstTitle" android:layout_width= "match_parent" android:layout_height= "wrap_content" ></com.androidannotations.viewgroup.titlewithsubtitle_>

@EApplication

?
1
2
3
4
@EApplication
public class MyApplication extends Application {
 
}

Activity中使用:
?
1
2
3
4
5
6
7
@EActivity
public class MyActivity extends Activity {
 
   @App
   MyApplication application;
 
}

@EService
?
1
2
3
4
@EService
public class MyService extends Service {
 
}

跳转service:
?
1
MyService_.intent(getApplication()).start();

停止service:
?
1
MyService_.intent(getApplication()).stop();

@EReceiver
?
1
2
3
4
@EReceiver
public class MyReceiver extends BroadcastReceiver {
 
}

@Receiver可以替代声明BroadcastReceiver
?
1
2
3
4
5
6
7
8
9
@EActivity
public class MyActivity extends Activity {
 
   @Receiver (actions = "org.androidannotations.ACTION_1" )
   protected void onAction1() {
 
   }
 
}

@EProvider
?
1
2
3
4
@EProvider
public class MyContentProvider extends ContentProvider {
 
}

@ViewById
?
1
2
3
4
5
6
7
8
9
10
@EActivity
public class MyActivity extends Activity {
 
   // Injects R.id.myEditText,变量名称必须和布局的id名称一致
   @ViewById
   EditText myEditText;
 
   @ViewById (R.id.myTextView)
   TextView textView;
}

@AfterViews
?
1
2
3
4
5
6
7
8
@EActivity (R.layout.main)
public class MyActivity extends Activity {
 
     @ViewById
     TextView myTextView;
 
     @AfterViews
     void updateTextWithDate() {<pre class = "brush:java;" > //一定要在这里进行view的一些设置,不要在oncreate()中设置,因为oncreate()在执行时 view还没有注入</pre>        myTextView.setText("Date: " + new Date());    }[...]

@StringRes
?
1
2
3
4
5
6
7
8
9
10
@EActivity
public class MyActivity extends Activity {
 
   @StringRes (R.string.hello)
   String myHelloString; //不能设置成私有变量
 
   @StringRes
   String hello;
 
}

@ColorRes
?
1
2
3
4
5
6
7
8
9
10
@EActivity
public class MyActivity extends Activity {
 
   @ColorRes (R.color.backgroundColor)
   int someColor;
 
   @ColorRes
   int backgroundColor;
 
}

@AnimationRes
?
1
2
3
4
5
6
7
8
9
10
@EActivity
public class MyActivity extends Activity {
 
   @AnimationRes (R.anim.fadein)
   XmlResourceParser xmlResAnim;
 
   @AnimationRes
   Animation fadein;
 
}

@DimensionRes
?
1
2
3
4
5
6
7
8
9
10
@EActivity
public class MyActivity extends Activity {
 
   @DimensionRes (R.dimen.fontsize)
   float fontSizeDimension;
 
   @DimensionRes
   float fontsize;
 
}

@DImensionPixelOffsetRes
?
1
2
3
4
5
6
7
8
9
10
@EActivity
public class MyActivity extends Activity {
 
   @DimensionPixelOffsetRes (R.string.fontsize)
   int fontSizeDimension;
 
   @DimensionPixelOffsetRes
   int fontsize;
 
}

@DimensionPixelSizeRes
?
1
2
3
4
5
6
7
8
9
10
@EActivity
public 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
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @EActivity
    public class MyActivity extends Activity {
     
       @Extra ( "myStringExtra" )
       String myMessage;
     
       @Extra ( "myDateExtra" )
       Date myDateExtraWithDefaultValue = new Date();
     
    }

    或者:
    ?
    1
    2
    3
    4
    5
    6
    7
    @EActivity
    public class MyActivity extends Activity {
     
       // The name of the extra will be "myMessage",名字必须一致
       @Extra
       String myMessage;
    }

    传值:
    ?
    1
    MyActivity_.intent().myMessage( "hello" ).start() ;

    @SystemService
    ?
    1
    2
    3
    4
    5
    6
    @EActivity
    public class MyActivity extends Activity { //
       @SystemService
       NotificationManager notificationManager;
     
    }

    @HtmlRes
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @EActivity
    public 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
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @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
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class MyActivity extends Activity { //等同于 Activity.onRetainNonConfigurationInstance()
     
       @NonConfigurationInstance
       Bitmap someBitmap;
     
       @NonConfigurationInstance
       @Bean
       MyBackgroundTask myBackgroundTask;
     
    }

    @HttpsClient
    ?
    1
    2
    <pre class = "brush:java;" > @HttpsClient
    HttpClient httpsClient;</pre>

    示例:
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    @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
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @EFragment
    public class MyFragment extends Fragment { //等同于 Fragment Argument
     
       @FragmentArg ( "myStringArgument" )
       String myMessage;
     
       @FragmentArg
       String anotherStringArgument;
     
       @FragmentArg ( "myDateExtra" )
       Date myDateArgumentWithDefaultValue = new Date();
     
    }
    ?
    1
    2
    3
    4
    MyFragment myFragment = MyFragment_.builder()
       .myMessage( "Hello" )
       .anotherStringArgument( "World" )
       .build();

    @Click
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Click (R.id.myButton)
    void myButtonWasClicked() {
         [...]
    }
    @Click
    void anotherButton() { //如果不指定则函数名和id对应
         [...]
    }
    @Click
    void 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.
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        @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.
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        @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
        ?
        1
        <pre class = "brush:java;" > //等同于SeekBar.OnSeekBarChangeListener.onProgressChanged(SeekBar, int, boolean)</pre>
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        @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
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        @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
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        @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
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        @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
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        @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
             }
        }

        或者:
        ?
        1
        2
        3
        4
        5
        @EActivity
        @OptionsMenu ({R.menu.my_menu1, R.menu.my_menu2})
        public class MyActivity extends Activity {
         
        }

        @Background执行:
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        void myMethod() {
             someBackgroundWork( "hello" , 42 );
        }
         
        @Background
        void someBackgroundWork(String aParam, long anotherParam) {
             [...]
        }

        取消:
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        void myMethod() {
             someCancellableBackground( "hello" , 42 );
             [...]
             boolean mayInterruptIfRunning = true ;
             BackgroundExecutor.cancelAll( "cancellable_task" , mayInterruptIfRunning);
        }
         
        @Background (id= "cancellable_task" )
        void someCancellableBackground(String aParam, long anotherParam) {
             [...]
        }

        非并发执行:
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        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);
        }

        延迟:
        ?
        1
        2
        3
        @Background (delay= 2000 )
        void doInBackgroundAfterTwoSeconds() {
        }

        @UiThreadUI线程:
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        void myMethod() {
             doInUiThread( "hello" , 42 );
        }
         
        @UiThread
        void doInUiThread(String aParam, long anotherParam) {
             [...]
        }

        延迟:
        ?
        1
        2
        3
        @UiThread (delay= 2000 )
        void doInUiThreadAfterTwoSeconds() {
        }

        优化UI线程:
        ?
        1
        2
        3
        @UiThread (propagation = Propagation.REUSE)
        void runInSameThreadIfOnUiThread() {
        }

        进度值改变:
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        @EActivity
        public 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
        ?
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        @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,或者留言。转载务必注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值