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

    普通类:

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


    注冊:

    <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 {
    
    }

    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) {
        [...]
    }

    其它点击事件:

    AdapterViewEvents 

    有两种方式调用:
    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);
    }
    
    @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框架能够专注于做逻辑开发,最主要是简化代码编写,easy维护。
    或者留言。转载务必注明出处。




  • 相关阅读:
    Swizzle在OC问题排查中的应用
    MacOS中系统提供的音频单元
    Mac catalyst 使用iOS-AudioUnit的音频采集、播放
    删除单向链表中的某一个节点
    C语言的的free和c++的delete的区别
    Mac下使用源码编译安装TensorFlow CPU版本
    ROC曲线与AUC值
    Linux中如何产生core文件?
    更改Linux默认栈空间的大小
    互信息(Mutual Information)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4188005.html
Copyright © 2020-2023  润新知