最近在使用Android studio,用到了androidannotations的库,但是有一些坑,为了记录一下,以备忘记。
http://blog.csdn.net/sw950729/article/details/52901669
annotation的配置
project的build.gradle
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.5.0' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' }}allprojects { repositories { jcenter() }}task clean(type: Delete) { delete rootProject.buildDir}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
moudle的build.gradle配置
apply plugin: 'com.android.application'apply plugin: 'android-apt'def AAVersion = '4.0+'repositories { jcenter() flatDir { dirs 'libs' }}android { compileSdkVersion 19 buildToolsVersion "23.0.2" defaultConfig { applicationId "source.code.watch.film" minSdkVersion 14 targetSdkVersion 14 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } signingConfigs { debug { storeFile file("E:\\psd\\debug.keystore") } }}dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') apt "org.androidannotations:androidannotations:$AAVersion" compile "org.androidannotations:androidannotations-api:$AAVersion"}apt { arguments { androidManifestFile variant.outputs[0].processResources.manifestFile resourcePackageName 'source.code.watch.film' }}
- 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
- 37
- 38
- 39
- 40
- 41
- 42
- 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
- 37
- 38
- 39
- 40
- 41
- 42
今天和大家介绍下Android的懒人框架:annotation。
注意:很多人都添加了
上面的37行到42行的apt代码,导致不能使用,出现Cannot get property 'processResources' on null object 的错误,
其实只要把这几行代码删除就行了。但是之后还有问题,
The AndroidManifest.xml file contains the original component, and not the AndroidAnnotations generated component. Please register LoginActivity_ instead of LoginActivity
会报出这个问题,其实这个问题很蛋疼,只需要把原来的清单配置文件中的activity名字后面添加个“_”就行了。
之前名字是MainActivity,我给换成了“MainActivity_”.就好了。
见网址:http://www.4byte.cn/question/1068592/androidannotations2-7-1-androidmanifest-xml-file-contains-the-original-component.html
@EActivity
@EActivity(R.layout.main)public class MyActivity extends Activity {}
@EFragment
@EFragment(R.layout.my_fragment_layout)public class MyFragment extends Fragment {}
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
@EActivity(R.layout.main)public class MyActivity extends Activity { @Bean MyClass myClass;}
@EActivity(R.layout.main)public class MyActivity extends Activity { @Bean(MyClass.class) MyClassInterface myClassInterface;}
@EBeanpublic class MyClass { @RootContext Context context; @RootContext Activity activity; @RootContext Service service; @RootContext MyActivity myActivity;}
@EActivity(R.layout.main)public class MyActivity extends Activity { @AfterInject public void doSomethingAfterInjection() { }}- 如果想在类创建时期做一些操作可以这么做
@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); }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
<com.androidannotations.viewgroup.TitleWithSubtitle_ android:id="@+id/firstTitle" android:layout_width="match_parent" android:layout_height="wrap_content" />
@EAplication
@EApplicationpublic class MyApplication extends Application {}
@EActivity(R.layout.main)public class MyActivity extends Activity { @App MyApplication application;}
EService
@EServicepublic class MyService extends Service {}
MyService_.intent(getApplication()).start();
MyService_.intent(getApplication()).stop()
@EReceiver
@EReceiverpublic class MyReceiver extends BroadcastReceiver {}
@EActivity(R.layout.main)public class MyActivity extends Activity { @Receiver(actions = "org.androidannotations.ACTION_1") protected void onAction1() { }}
@EProvider
@EProviderpublic class MyContentProvider extends ContentProvider {}
@EViewById
@EActivity(R.layout.main)public class MyActivity extends Activity { @ViewById EditText myEditText; @ViewById(R.id.myTextView) TextView textView;}- 没有括号里定义的变量名称必须和布局的id名称一致
@EAfterViews
@EActivity(R.layout.main)public class MyActivity extends Activity { @ViewById TextView myTextView; @AfterViews void updateTextWithDate() { myTextView.setText("Date: " + new Date()); }} 一定要在这里进行view的一些设置,不要在oncreate()中设置,因为oncreate()在执行时 view还没有注入
@StringRes
@EActivity(R.layout.main)public class MyActivity extends Activity { @StringRes(R.string.hello) String myHelloString; @StringRes String hello;}- 不能将变量设置成私有变量
@ColorRes
@EActivity(R.layout.main)public class MyActivity extends Activity { @ColorRes(R.color.backgroundColor) int someColor; @ColorRes int backgroundColor;}
@AnimationRes
@EActivity(R.layout.main)public class MyActivity extends Activity { @AnimationRes(R.anim.fadein) XmlResourceParser xmlResAnim; @AnimationRes Animation fadein;}
@DimensionRes
@EActivity(R.layout.main)public class MyActivity extends Activity { @DimensionRes(R.dimen.fontsize) float fontSizeDimension; @DimensionRes float fontsize;}
@DimensionPixelOffsetRes
@EActivity(R.layout.main)public class MyActivity extends Activity { @DimensionPixelOffsetRes(R.string.fontsize) int fontSizeDimension; @DimensionPixelOffsetRes int fontsize;}
@DimensionPixelSizeRes
@EActivity(R.layout.main)public class MyActivity extends Activity { @DimensionPixelSizeRes(R.string.fontsize) int fontSizeDimension; @DimensionPixelSizeRes int fontsize;}
@EActivity(R.layout.main)public class MyActivity extends Activity { @Extra("myStringExtra") String myMessage; @Extra("myDateExtra") Date myDateExtraWithDefaultValue = new Date();}
@EActivity(R.layout.main)public class MyActivity extends Activity { @Extra String myMessage;}- The name of the extra will be "myMessage",名字必须一致
MyActivity_.intent().myMessage("hello").start()
MyActivity_.intent().myMessage("hello").startForResult()
@SystemService
@EActivity(R.layout.main)public class MyActivity extends Activity { @SystemService NotificationManager notificationManager;}
@HtmlRes
@EActivity(R.layout.main)public class MyActivity extends Activity { @HtmlRes(R.string.hello_html) Spanned myHelloString; @HtmlRes CharSequence helloHtml;}
@FromHtml
@EActivity(R.layout.main)public class MyActivity extends Activity { @ViewById(R.id.my_text_view) @FromHtml(R.string.hello_html) TextView textView; @ViewById @FromHtml TextView hello_html;}- 必须用在TextView
@NonConfigurationInstance
@EActivity(R.layout.main)public class MyActivity extends Activity { @NonConfigurationInstance Bitmap someBitmap; @NonConfigurationInstance @Bean MyBackgroundTask myBackgroundTask;}- 等同于Activity.onRetainNonConfigurationInstance()
@Click
@Click(R.id.myButton)void myButtonWasClicked() {}@Clickvoid anotherButton() {}@Clickvoid yetAnotherButton(View clickedView) {}- LongClick和这个类似
@SeekBarProgressChange
@SeekBarProgressChange(R.id.seekBar) void onProgressChangeOnSeekBar(SeekBar seekBar, int progress, boolean fromUser) { } @SeekBarProgressChange(R.id.seekBar) void onProgressChangeOnSeekBar(SeekBar seekBar, int progress) { } @SeekBarProgressChange({R.id.seekBar1, R.id.seekBar2}) void onProgressChangeOnSeekBar(SeekBar seekBar) { } @SeekBarProgressChange({R.id.seekBar1, R.id.seekBar2}) void onProgressChangeOnSeekBar() { }- @SeekBarTouchStart 和 @SeekBarTouchStop 接受开始和结束事件的监听
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
@TextChange
@TextChange(R.id.helloTextView) void onTextChangesOnHelloTextView(CharSequence text, TextView hello, int before, int start, int count) { } @TextChange void helloTextViewTextChanged(TextView hello) { } @TextChange({R.id.editText, R.id.helloTextView}) void onTextChangesOnSomeTextViews(TextView tv, CharSequence text) { } @TextChange(R.id.helloTextView) void onTextChangesOnHelloTextView() { }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
@BeforeTextChange
@BeforeTextChange(R.id.helloTextView) void beforeTextChangedOnHelloTextView(TextView hello, CharSequence text, int start, int count, int after) { } @BeforeTextChange void helloTextViewBeforeTextChanged(TextView hello) { } @BeforeTextChange({R.id.editText, R.id.helloTextView}) void beforeTextChangedOnSomeTextViews(TextView tv, CharSequence text) { } @BeforeTextChange(R.id.helloTextView) void beforeTextChangedOnHelloTextView() { }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
@AfterTextChange
@AfterTextChange(R.id.helloTextView) void afterTextChangedOnHelloTextView(Editable text, TextView hello) { } @AfterTextChange void helloTextViewAfterTextChanged(TextView hello) { } @AfterTextChange({R.id.editText, R.id.helloTextView}) void afterTextChangedOnSomeTextViews(TextView tv, Editable text) { } @AfterTextChange(R.id.helloTextView) void afterTextChangedOnHelloTextView() { }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
@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
void myMethod() { doInUiThread("hello", 42);}@UiThreadvoid doInUiThread(String aParam, long anotherParam) {}- UI线程
@UiThread(delay=2000)void doInUiThreadAfterTwoSeconds() {}- 延迟
@UiThread(propagation = Propagation.REUSE)void runInSameThreadIfOnUiThread() {}- 优化UI线程
@EActivity(R.layout.main)public class MyActivity extends Activity { @Background void doSomeStuffInBackground() { publishProgress(0); publishProgress(10); publishProgress(100); } @UiThread void publishProgress(int progress) { }}- 后台向UI线程传值
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
@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() {}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
好了。关于annotation的介就是这么多。欢迎进群交流。还有,求工作啊!!!!
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerT
- 关于Android在非UI线程更新UI的问题。
- 读写系统设置
- android利用handler线程间的通信
- Android(安卓)IntentService vs Service
- 配置android环境
- android中在子线程中更新UI的几种方法
- android 线程通信Handler Bundle
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerT
随机推荐
-
[持续更新]Android(安卓)细节,小技巧 详
-
android隐藏标题栏和状态
-
Android(安卓)最佳实践
-
Android(安卓)Bitmap 透明度(Picture 透
-
[Android(安卓)Memory] Android(安卓)Lin
-
Android(安卓)多线程延迟(sleep)
-
Android(安卓)Activity之间经典切换动画
-
Android(安卓)OpenGL ES教程 第二部分 构
-
Android自定义对话框
-
android 异步处理 后台更新