Giới thiệu thư viện AndroidAnnotation

1.Giới thiệu về AndroidAnnotations framework

AndroidAnnotations là một framework mã nguồn mở cho phép các lập trình viên có thể phát triển ứng dụng android một cách nhanh chóng. Nó giúp cho việc viết code của bạn trở nên ngắn gọn, từ đó có thể tiết kiệm thời gian cho những phần việc thực sự quan trọng. Ngoài ra việc sử dụng AndroidAnnotation làm cho code gọn gàng, dễ hiểu thuận tiện cho việc bảo trì sau này.

AndroidAnnotations làm việc theo cách rất đơn giản, nó tự động thêm một trình biên dịch để tự động tạo ra source code, sử dụng Java Annotation Processing Tool.

Để sử dụng AndroidAnnotations trong android studio các bạn settup gradle, sử dụng android-apt Gradle plugin

Module project:

buildscript {
    repositories {
      mavenCentral()
    }
    dependencies {
        // replace with the current version of the Android plugin
        classpath 'com.android.tools.build:gradle:1.5.0'
        // replace with the current version of the android-apt plugin
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

repositories {
    mavenCentral()
    mavenLocal()
}

Module: app

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

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 23
    }
}

Hiện tại version mới nhất của androidannotations là 4.1.0

2.Các thành phần cơ bản của AndroidAnnotations

AndroidAnnotations cung cấp cho chúng ta một loạt các Annotation để chúng ta có thể sử dụng giúp cho việc viết code nhanh và ngắn gọn hơn rất nhiều.

a. Enhanced components

  • @EActivity: Annotation này thông báo với trình biên dịch rằng class này là một Enhanced components và sẽ được Enhanced bởi AndroidAnnotation, tham số mà annotation này nhận vào là layout của Activity. Sau khi build lại project sẽ có một class cùng tên với Activity và thêm dấu gạch dưới được tạo ra cùng với đó là một loại các method được generate tự động mà chúng ta không phải code.

vidu:

 @EActivity(R.layout.main)
public class MyActivity extends Activity {

}

class được tạo tự động sẽ có nội dung như sau

public class MyActivity_ extends MyActivity {

}

Một lưu ý khi sử dụng annotation này đó là các bạn khai báo activity là subclass được tạo ra thay vì khai báo activity các bạn định nghĩa trong file AndroidManifest.

  • @EFragment: cũng tương tự như Activity khi bạn khai báo Annotation này trên một fragment thì nó cũng sẽ tạo ra một subclass và chúng ta sẽ sử dụng subclass này trong file xml khi muốn khai báo cho fragment.

vidu:

@EFragment(R.layout.my_fragment_layout)
public class MyFragment extends Fragment {
}

Ngoài ra chúng ta cũng có thể sử dụng @FragmentById@FragmentByTag để inject fragment.

  • @EService: Ta có thể Enhance một Android Service bằng cách sử dụng android annotation này
@EService
public class MyService extends Service {

}

và thực hiện start service:

MyService_.intent(getApplication()).start();

Stop service

MyService_.intent(getApplication()).stop();
  • @EView, @EViewGroup: trong nhiều trường hợp khi phát triển ứng dụng các bạn cần tạo một component view theo một yêu cầu hoặc muốn tạo những customview để có thể sử dụng tại nhiều nơi, tránh lặp lại code, khi đó chúng ta sẽ sử dụng hai Annotation trên để dễ dàng có thể inject resource và view con cho việc custom.
@EView
public class CustomButton extends Button {

        @App
        MyApplication application;

        @StringRes
        String someStringResource;

    public CustomButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.androidannotations.view.CustomButton_
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <!-- ... -->

</LinearLayout>

b, Injecting stuff

AndroidAnnotation hỗ trợ chúng ta trong việc inject các thành phần như View, Resource, Fragment arguments, Intent Extra, ... làm cho việc viết code của chúng ta trở nên ngắn gọn hơn rất nhiều, bây giờ thay vì phải viết đi viết lại những đoạn code nhàm chán để khởi tạo giá trị thì chúng ta chỉ cần khai báo các Annotation và phần việc còn lại AndroidAnnotation sẽ giúp chúng ta.

  • Inject View: Khi muốn inject một view chúng ta sử dụng annotation @ViewById
@EActivity(R.layout.main)
public class MyActivity extends Activity {

    @ViewById
    TextView myTextView;

    @AfterViews
    void updateTextWithDate() {
        myTextView.setText("Date: " + new Date());
    }
[...]

Annotation @AfterViews được sử dụng ở trên cho biết rằng method ngay dưới nó sẽ được gọi khi các view đã được khởi tạo xong.

  • Inject Resource: Khi muốn Inject một resource thuộc một loại nào đó chúng ta sẽ sử dụng một Annotation tương ứng

@StringRes

@ColorRes

@AnimationRes

@DimensionRes

@DimensionPixelOffsetRes

c, Clear event handling

Thay vì phải set event cho view trong code của bạn chỉ cần sử dụng một Annotation cho view đó và định nghĩa method sẽ thực thi khi sự kiện xảy ra

@Click(R.id.myButton)
void myButtonWasClicked() {
    [...]
}

@Click
void anotherButton() {
    [...]
}

@Click
void yetAnotherButton(View clickedView) {
    [...]
}

@Click({R.id.myButton, R.id.myOtherButton})
void handlesTwoButtons() {
    [...]
}

Tham khảo thêm tại: https://github.com/androidannotations/androidannotations/wiki/ClickEvents