Android androidannotations注解框架详解

**基本功不扎实,功力永远无法登峰造极
自Android studio更新到3.0版本,grodle不支持apt的配置,但是以往的帖子在配置androidannotations的时候,好像哪一篇都有提到apt,汗颜。。。
找了一趟,发现,很多所谓的Android studio配置androidannotations的帖子,大部分都一样,也就没想继续看了,灰心了,但是转念一想,Android studio是老外搞出来的,外国应该有,在遍布英文的论坛里找啊,哈哈,还真有,来来来。
Android studio3.0配置androidannotations的方法。如果兄台还在使用2.3.0,那你不妨也看一下。
首先在Module的gradle中
def AAVersion = ‘4.4.0’
然后
android {
……..
defaultConfig {
……….
javaCompileOptions {
annotationProcessorOptions {
arguments = [“resourcePackageName”: android.defaultConfig.applicationId]
}
}
}
lintOptions {
checkReleaseBuilds false
abortOnError false
}
buildTypes {
release {
……….
applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = “App-v variant.versionNamev {variant.versionCode}.apk”
}
}
}
}
}

这里写图片描述
这里写图片描述
最后在dependencies中添加依赖就好
annotationProcessor
“org.androidannotations:androidannotations: AAVersionimplementationorg.androidannotations:androidannotationsapi: AAVersion”
这里写图片描述
ok,配置完成,在同步一下我们的工程
打开MainActivity,删除掉setContentView(R.layout.main)方法,然后这样写:
@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
……….
}
当你完打出@的时候,提示列表出现@EActivity的时候,那么,恭喜你,配置成功。
但是在使用的时候不要忘记在我们的清单文件中(manifests)做一个小小的修改
android:name=”.MainActivity_”
在MainActivity的后面加上一个下划线,因为,我们使用的不是已写好的代码,而是,通过androidannotations生成的新的代码:
这里写图片描述

就像这样。
接下来就是使用了
https://github.com/androidannotations/androidannotations/wiki/AvailableAnnotations
里面有各种注解使用和解释

在androidannotations官方,把全部注解总共分为9个模块
分别是:
(1)Enhanced components(增强的组件)
(2)Injection (注入)
(3)Event binding (事件绑定)
(4)hreading (线程)
(5)Misc (杂篇)
(6)Resource injection (资源注入)
(7)Rest API (编程接口)
(8)Typesafe SharedPreferences (类型安全的SharedPreferences)
(9)Preference API helpers (偏好API助手)

本篇主要讲解部分常用注解:
(1)Enhanced components(增强的组件)

这里写图片描述
@EActivity
这个注解相当于Android中的setContentView(R.layout.main)方法,使用:
@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
……….
}
作用,代替了setContentView(R.layout.main)这个方法,换言之,onCreate方法你可以省略了。。。
是不是很方便。
当然,在manifests中注册的时候,不要忘记在Activity后加下划线。

参考:http://blog.csdn.net/sinat_14879443/article/details/46867415
@EBean
使用@EBean的JavaBean,能直接取到调用他的Context,支持@ViewById标签找到控件,因此,构造方法传过来的参数可以少很多。

@EBean
public class Student {
//RootContext能取到调用该Bean的Context,构造方法不再需要传Context参数
@RootContext
Context context;
@RootContext
MainActivity activity;
//ViewById也能在这里直接使用
@ViewById
TextView tv;
//后台线程执行
@Background
public void backThread()
{
//线程中要走的方法;
}
//UiThread在UI线程执行
@UiThread
public void updateTv(int i)
{
//ui线程要做的操作
}
//AfterInject在构造方法执行完成后执行
@AfterInject
public void doSomethingAfterInject()
{
}
}

在这个类中用到了Context,TextView,以往我们需要通过构造传入,但是现在在@EBean的JavaBean中通过@RootContext获取上下文。

@EFragment
功能同@EActivity,使用:
@EFragment(R.layout.home_fragment_layout)
public class HomeFragment extends Fragment {
……….
}

第一个框内是组建的使用,这里就不过多讲解了,类似于@EActivity的使用。
第二个是自定义View:

@EView
对自定义View的注解
@EView
public class CustomButton extends Button {
@App//注入App(Application)
MyApplication application;
@StringRes//字符串资源的引用
String someStringResource;

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

xml文件中的使用:
< com.androidannotations.view.CustomButton_
android:layout_width=”match_parent”
android:layout_height=”wrap_content” />
@EViewGroup使用方法同上

(2)Injection (注入)
这里写图片描述
从图片来看,可大致分为:控件使用相关,实体注入相关,Fragment注入相关,网络相关,其他注入以及控件注入,每个挑一个来说说:

@AfterViews
实例化控件之后,给控件进行初始化。使用:
@AfterViews
public void setTv(){
//该方法对控件进行初始化设置
AaTv.setText(“唯一的TextView”);
}
注:控件的初始化不可以在onCreate方法中调用,可能会包空指针,
官方解释:
You can annotate multiple methods with @AfterViews. Don’t forget that you should not use any view field in onCreate():
译:可以使用@afterview来注释多个方法。不要忘记在onCreate()中不应该使用任何视图字段
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// DON’T DO THIS !! It will throw a NullPointerException, myTextView is not set yet.
//不要这样做!!它将抛出NullPointerException,myTextView还没有设置。
// myTextView.setText(“Date: ” + new Date());
}

@Extra
在Activity跳转的过程中传入的参数:
在跳转的目标Activity中:
@EActivity(R.layout.kugga_enlive_activity)
public class EndLiveActivity extends Activity {
@Extra
String time;
@Extra
String liveCover;
@Extra
String watchNum;
……………..
}
接下来就是跳转的方法:
EndLiveActivity_.intent(所在的Activity.this)
.time(time)
.liveCover(liveCover)
.watchNum(watchNum)
.start();

what?这是什么鬼!!
其实这是他的一个普通跳转方法。稍后解释。

@FragmentId
类似于@ViewById,将布局中的Fragment实例
@FragmentById(R.id.myFragment)
MyFragment myFragment2;

@FromHtml
设置HTML文本到TextView上:
@ViewById(R.id.my_text_view)
@FromHtml(R.string.hello_html)
TextView textView;
注:这个注解必须在加了 @ViewById注解的 TextView 上使用。

@RootContext
RootContext能取到调用该Bean的Context,构造方法不再需要传Context参数
@RootContext
Context context;
or
@RootContext
MainActivity activity;

@ViewById
相当于findViewById()方法,使用:
@ViewById(R.id.lzn_aa_button)
Button mLznAaButton;
如果id和button的命名相同,可以省略(R.id.lzn_aa_button),写成:
@ViewById
Button mLznAaButton;

(3)Event binding (事件绑定)
这里写图片描述

在这个时间绑定之中,通过观察可以发现,其中的注解可大致分为六个模块:View变化相关,控件状态相关,触摸、点击、长按事件,菜单,SeekBar相关,事件相关,viewpager相关。

老规矩,挑一个讲,其他的自己学着用:
@TextChange
官方解释:This annotation is intended to be used on methods to receive events defined by android.text.TextWatcher.onTextChanged(CharSequence s, int start, int before, int count) when the text is changed on the targeted TextView or subclass of TextView. The annotation value should be one or several R.id.* fields that refers to TextView or subclasses of TextView. If not set, the method name will be used as the R.id.* field name. The method may have multiple parameter。

译:这个注释的目的是用于定义为android.text.TextWatcher接收事件的方法。当文本在目标TextView或TextView的子类上发生更改时,onTextChanged(CharSequence s、int开始、int计数)。注释值应该是一个或多个R.id。引用TextView或TextView的子类的字段。如果不设置,方法名将用作r.id。*字段名。该方法可能有多个参数。

@TextChange(R.id.helloTextView)
void onTextChangesOnHelloTextView(CharSequence text, TextView hello, int before, int start, int count) {
// Something Here
}

一共5个参数:
CharSequence text 获取修改后的文本、
TextView hello 那个视图接受的、
int before 文本长度、
int start 获得修改后的文本的开始位置、
int count 修改后的字符的数量。

@FocusChange
用于判断某个视图是否获得焦点。

@FocusChange(R.id.helloTextView)
void focusChangedOnHelloTextView(View hello, boolean hasFocus) {
// Something Here
}

参数解释:
View hello 视图,对那个视图有效、
boolean hasFocus 布尔值,是否获取焦点。

@Click
哈哈,最经常用的东西来了。点击事件的注解
@Click(R.id,button)
public void anotherButton() {
[…]
}
or
@Click({R.id.myButton, R.id.myOtherButton})
public void handlesTwoButtons() {
[…]
}

这样就表示给id为???的控件添加了点击事件,然后在方法体中写要执行的方法就可以。

@OptionsItem
菜单选项的点击事件
@OptionsItem
void menu_add(MenuItem item) {
// You can add a MenuItem parameter to access it
}
@OptionsItem的使用请参考:(https://github.com/androidannotations/androidannotations/wiki/Handling-options-menu

@SeekBarProgressChange
这是对于进度条(SeekBar)的一个注解,在官网有说明:
This annotation is intended to be used on methods to receive events defined by SeekBar.OnSeekBarChangeListener.onProgressChanged(SeekBar, int, boolean) when the progress level of a SeekBar view has changed.

译:这个注释的目的是用于定义为SeekBar.OnSeekBarChangeListener接收事件的方法。当一个SeekBar视图的进度级别发生变化时,onprogress变更(SeekBar、int、boolean)。

@SeekBarProgressChange(R.id.seekBar)
void onProgressChangeOnSeekBar(SeekBar seekBar, int progress, boolean fromUser) {
// Something Here
}

参数:
SeekBar seekBar:SeekBar参数来确定针对该事件的哪个视图、
int progress: 获得SeekBar的进度级别、
boolean fromUser: 确定该事件是否由用户触发。

@KeyDown
是不是很熟悉,其实就是对我们之前的KeyEvent做的注解,不多说。

@PageScrolled
相当于android.support.v4.view.ViewPager.OnPageChangeListener接收事件的方法。
@PageScrolled(R.id.viewpager)
void onPageScrolled(ViewPager view, int position, float positionOffset, int positionOffsetPixels) {
// Something Here
}

参数:
ViewPager view 首先是视图,不多说,你懂得。
int position 当前位置。
float positionOffset 视图偏移量。
int positionOffsetPixels 以像素为单位的偏移量。

(4)hreading (线程)
和平时的使用相差不是很大,不过去简单了许多:
@Background
public void backThread()
{
//后台线程执行的方法
…………
//在UI线程中更新
updateTv(i);
}
//UiThread在UI线程执行
@UiThread
public void updateTv(int i)
{
tv.setText(String.valueOf(i));
}

咋样,��是不是很简单。

其他的就不过多说了,简单说说资源注入,其他的需要自己琢磨喽。

例举一个简单的:
@StringRes
很明显,String字符串资源注入
使用:
@StringRes(R.string.hello)
String myHelloString;
这样一来,就相当于myHelloString = getString(R.string.hello);
其他资源注入用法相同。

此次讲解就到这里,欢迎吐槽。

自己建了一个交流群,小打小闹,欢迎捧场
群号:458792278
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值