Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 最火的快速開發框架AndroidAnnotations使用詳解

Android 最火的快速開發框架AndroidAnnotations使用詳解

編輯:關於Android編程

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 {
}
注冊:

創建:

MyFragment fragment = new MyFragment_();

普通類:

@EBean
public class MyClass {

}


注意:這個類必須僅僅只能有一個構造函數,參數最多有一個context。

Activity中使用:

@EActivity
public class MyActivity extends Activity {

  @Bean
  MyOtherClass myOtherClass;

}

也可以用來聲明接口:

@Bean(MyImplementation.class)
    MyInterface myInterface;

在普通類中還可以注入根環境:

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

單例類需要如下聲明:

@EBean(scope = Scope.Singleton)
public class MySingleton {

}

注意:在單例類裡面不可以注入view和事件綁定,因為單例的生命周期比Activity和Service的要長,以免發生內存溢出。

@EView

@EView
public class CustomButton extends Button {

        @App
        MyApplication application;

        @StringRes
        String someStringResource;

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}


注冊:


創建:

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);
    }

}

注冊:


@EApplication

@EApplication
public class MyApplication extends Application {

}

Activity中使用:
@EActivity
public class MyActivity extends Activity {

  @App
  MyApplication application;

}

@EService
@EService
public class MyService extends Service {

}

跳轉service:
MyService_.intent(getApplication()).start();

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

@EReceiver
@EReceiver
public class MyReceiver extends BroadcastReceiver {

}

@Receiver 可以替代聲明BroadcastReceiver
@EActivity
public class MyActivity extends Activity {

  @Receiver(actions = "org.androidannotations.ACTION_1")
  protected void onAction1() {

  }

}

@EProvider
@EProvider
public class MyContentProvider extends ContentProvider {

}

@ViewById
@EActivity
public 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
@EActivity
public class MyActivity extends Activity {

  @StringRes(R.string.hello)
  String myHelloString;//不能設置成私有變量

  @StringRes
  String hello;

}

@ColorRes
@EActivity
public class MyActivity extends Activity {

  @ColorRes(R.color.backgroundColor)
  int someColor;

  @ColorRes
  int backgroundColor;

}

@AnimationRes
@EActivity
public class MyActivity extends Activity {

  @AnimationRes(R.anim.fadein)
  XmlResourceParser xmlResAnim;

  @AnimationRes
  Animation fadein;

}

@DimensionRes
@EActivity
public class MyActivity extends Activity {

  @DimensionRes(R.dimen.fontsize)
  float fontSizeDimension;

  @DimensionRes
  float fontsize;

}

@DImensionPixelOffsetRes
@EActivity
public class MyActivity extends Activity {

  @DimensionPixelOffsetRes(R.string.fontsize)
  int fontSizeDimension;

  @DimensionPixelOffsetRes
  int fontsize;

}

@DimensionPixelSizeRes
@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
    @EActivity
    public 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
    @EActivity
    public class MyActivity extends Activity {//
      @SystemService
      NotificationManager notificationManager;
    
    }

    @HtmlRes
    @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
    @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
    @HttpsClient
    HttpClient 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
    @EFragment
    public 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() {
        [...]
    }
    @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.
        @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);
        }
        
        @Background
        void 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);
        }
        
        @UiThread
        void doInUiThread(String aParam, long anotherParam) {
            [...]
        }

        延遲:
        @UiThread(delay=2000)
        void doInUiThreadAfterTwoSeconds() {
        }

        優化UI線程:
        @UiThread(propagation = Propagation.REUSE)
        void runInSameThreadIfOnUiThread() {
        }

        進度值改變:
        @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
        @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. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved