Android Annotation的一些简单使用

1. 配置

根据github上github可以知道annotation(后面简称AA)怎么在as项目中配置的。
因为我的as中gradle版本是2.2的,还不能使用2.3中内置的插件,所以还是要配置apt 在根gradle中将复制进去

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

接下来的和github上它提示的不一样,github上是说将如下代码也复制进根gradle中

repositories {
    mavenCentral()
    mavenLocal()
}

apply plugin: 'com.android.application'
apply plugin: 'android-apt'
def AAVersion = 'XXX'

dependencies {
    apt "org.androidannotations:androidannotations:$AAVersion"
    compile "org.androidannotations:androidannotations-api:$AAVersion"
}

apt {
    arguments {
        // you should set your package name here if you are using different application IDs
        // resourcePackageName "your.package.name"

        // You can set optional annotation processing options here, like these commented options:
        // logLevel 'INFO'
        // logFile '/var/log/aa.log'
    }
}

但是其实并不用,这样做的好处是多个modul时都要使用AA,则只要在这里配置一次就行了,但是实际项目中这样的情况还是少,一般都是一个主modul,就算有其他modul,也是库用来依赖的。并且在modul中的gradle中配置可以少一些代码。所以我接下来直接去modul下的gradle中,将如下代码复制进去

apply plugin: 'android-apt'
def AAVersion = '4.2.0'

apply plugin: ‘com.android.application’这行代码并不需要,因为已经有了,同理如下,也有了不需要

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 23
    }
}

所以我们只要将下面这代码复制到dependencies中就可以了

    apt "org.androidannotations:androidannotations:$AAVersion"
    compile "org.androidannotations:androidannotations-api:$AAVersion"

下面这行代码也复制进去,不知道有什么用,看字面上意思,看不懂

apt {
    arguments {
        // you should set your package name here if you are using different application IDs
        // resourcePackageName "your.package.name"

        // You can set optional annotation processing options here, like these commented options:
        // logLevel 'INFO'
        // logFile '/var/log/aa.log'
    }
}

2.干货

我使用了下并且看了下wiki,AA给我的感觉就是鸡肋,AA可以注入android中的很多,不仅仅这些简单的findviewbyid,或者setonclicklistener,还有activity,application,bean(实体类),service,还有事件的注入,其实setOnClickListener其实就是,还有其他的等下代码说。但是不知道是不是我理解不够,只学了两三天,感觉很多东西就是强心注入,并不能减轻或者简化使用,等下看例子就知道了。当然widgit的注入还是不错的。
A.widgit的注入
比如button,textview等等这些。xml代码如下,主要注意id

 <Button
        android:id="@+id/bt1"
        android:text="点击跳转"
        android:layout_width="match_parent"
        android:layout_height="50dp" />

java代码如下

    @ViewById(R.id.bt1)
    Button button1;

其实这里面很有讲究,上面这行代码其实就已经获取到Button的实例了,我们可以操作button1了。比如我们想拿到这个button的内容,直接在onCreate中写上button1.getText().toString();,如果我们在使用@ViewById时并不想(R.id.bt1)也可以,只要xml中id是这个Button的命名就行,这种思路在AA中很多地方都用到了,所以上面的代码其实也可以这样写

  @ViewById
  Button bt1;

其他的textview或者editetext之类的都是一样的。
B.事件的注入
我这里举两个例子,一个使点击事件的注入,这个使用的还算正常,还有个是内容变化事件的注入,太蛋疼了。
点击事件,就拿上面那个button举例,我们可以这样些

    @Click(R.id.bt1)
    void clickButtion1(){
       //点击后想做的事情
    }

同样因为XML中button的id原因,也可以这样写

  @Click
  void bt1(){
        //点击后想做的事情 
    }

这样子还算正常,确实会简单些,但是如果是复杂的事件注入,方法里面很多参数的,并且这些参数在方法中需要使用的,就尴尬了,如EditText,

  <EditText
        android:id="@+id/et1"
        android:layout_width="match_parent"
        android:layout_height="50dp" />

EditText有个监听内容变化的事件,正常写应该是这样的

  @ViewById
  EditText et1;

  et1.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

如果我们采用AA注入写,则就是这样,还需要手动将参数复制到方法中,最主要我们并不知道里面有哪些参数…..有点麻烦。

  @BeforeTextChange(R.id.et1)
  void beforeEd(CharSequence s, int start, int count, int after){

    }
  @TextChange(R.id.et1)
  void textChange(CharSequence s, int start, int before, int count){

    }
  @AfterTextChange(R.id.et1)
  void afterChanger(Editable s){

    }

C.Activity、Application的注入
首先来看activity的注入,我们必须要知道一点,activity只要一注入,则manifest中一定要使用对应的下划线activity注册,并且其他地方使用时也使用下划线的activity。如下面使用@EActivity

@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

}

清单文件中应该是MainActivity_,见下面

 <activity android:name=".MainActivity_">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

这样子写,清单文件中可能会报错,这还好,但是在java代码中如果哪里牵扯这注入的这个activity,则也使用activity_,也会提示错误,很正常,因为没有这个类,但是运行则没事,代码可以跑起来。比如刚才上面的button,点击后跳转一个注入的activity,
新建SecondActivity,并将它注入

@EActivity(R.layout.activity_second)
public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }
}

清单文件中

   <activity android:name=".SecondActivity_" />

接下来在click中,看这个secondactivity,使用的是带下划线的

    @Click(R.id.bt1)
    void clickButtion1(){
        Intent intent = new Intent(this,SecondActivity_.class);
        startActivity(intent);
    }

写上去后显示报错的,但是运行后就没事了。
application注入,比如我新建一个MyApplication,并将它使用AA注入,并且在里面写一个方法,就是显示一个弹框

@EApplication
public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

    }


    public void showToast(){
        Toast.makeText(getApplicationContext(),"我是application里面的方法",Toast.LENGTH_SHORT).show();
    }

}

和activity一样,在清单文件中也需要加下划线。

    android:name=".MyApplication_"

在java代码中其他地方使用这个MyApplication时采用@App就可以获取到它实例,比如我在刚才的secondActivity中加一个button,点击它调用MyApplication里面的那个方法。

    @App
    MyApplication myApplication;  //如果application已经注入,     使用@App就能获取它的实例
 @Click(R.id.bt2)
    void clickButton(){
       myApplication.showToast();
    }

ok,其他的比如service只要需要在清单文件中配置,只要注入了,都需要使用它对应带下划线的…..
D.bean实体类的注入
这个就简单了,其实就是使用@EBean对bean注入,在需要使用的地方使用@Bean获取它的实例,唯一要注意的就是需要在这个bean中写一个空构造函数。这其实很好理解我们在使用@Bean获取实例时应该也是使用构造函数获取对象的,所以需要个构造函数,如下

@EBean
public class Person {

    private String name;
    private String age;

    public Person() {

    }
}
    @Bean
    Person person;

3.最后

因为github上AA的内容实在太多了没看完,步骤,但是根据上面这些在项目中已经可以减少很多重复代码了 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值