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

    xiaoxiao2021-03-25  96

    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 @ClickLong clicks with @LongClickTouches with @Touch

    AdapterViewEvents

    Item clicks with @ItemClickLong item clicks with @ItemLongClickItem 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,或者留言。转载务必注明出处。
    转载请注明原文地址: https://ju.6miu.com/read-19427.html

    最新回复(0)