Skip to content

Enhance custom classes

pyricau edited this page Jan 12, 2012 · 25 revisions

Since AndroidAnnotations 2.3

Enhancing custom classes

You can use annotations in a class that is not a standard Android component (such as an Activity, a Service).

You just need to annotate it with @Enhanced:

@Enhanced
public class MyClass {

}

Injecting enhanced classes

To use this enhanced class in another enhanced class or in an enhanced Android component, use @Inject:

@Enhanced
public class MyOtherClass {

  @Inject
  MyClass myClass;

}

Notice how you can chain dependencies:

@EActivity
public class MyActivity extends Activity {

  @Inject
  MyOtherClass myOtherClass;

}

Please note that there is currently no notion of scope (singleton, prototype, context scope). This means that you always get a new instance when you use @Inject on a field.

Supported annotations

You can use most AA annotations in an @Enhanced class:

@Enhanced
public class MyClass {

  @SystemService
  NotificationManager notificationManager;

  @UiThread
  void updateUI() {

  }

}

View related annotations

You can use view related annotations ([@View](Injecting Views), @Click...) in your @Enhanced class:

@Enhanced
public class MyClass {

  @ViewById
  TextView myTextView;

  @Click(R.id.myButton)
  void handleButtonClick() {

  }

}

Notice that this will only work if the root Android component that depends on MyClass is an activity with a layout that contains the needed views. Otherwise, myTextView will be null, and handleButtonClick() will never be called.

Injecting the root context

You can inject the root Android component that depends on your @Enhanced class, using the @RootContext annotation. Please notice that it only gets injected if the context has the right type.

@Enhanced
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;

}

In the MyClass instance referenced by the following activity, the service field of MyClass (see above) will be null.

@EActivity
public class MyActivity extends Activity {

  @Inject
  MyClass myClass;

}

Using AndroidAnnotations

Questions?

Enjoying AndroidAnnotations

Improving AndroidAnnotations

Clone this wiki locally