我的目标是能够注释基于TextView的类,以便我可以在其上注入自定义字体,而无需搜索我的整个(和庞大的)代码库。由于我有一个AspectJ Android项目,它似乎是AOP的一个好工作。
我首先定义了以下注释:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InsertFontTypeFace
{
String typeFacenamePathInAssets() default "";
}
在我的活动中我有这样的事情:
@InsertFontTypeFace(typeFacenamePathInAssets="fonts/myCustomFont.ttf")
private Button myButton;
最后,就我而言,我有:
pointcut textViewBasedWidgetInitialization(TextView thisObject, InsertFontTypeFace annotation): initialization(TextView+.new(..)) && @annotation(annotation) && target(thisObject);
after(TextView thisObject, InsertFontTypeFace annotation) : textViewBasedWidgetInitialization(thisObject, annotation)
{
String pathToFont = annotation.typeFacenamePathInAssets();
if(! EMPTY_STRING.equals(pathToFont))
{
Typeface myTypeface = Typeface.createFromAsset(thisObject.getContext().getAssets(), pathToFont);
thisObject.setTypeface(myTypeface);
}
}
我还尝试使用以下切入点来捕获字段设置:
pointcut textViewBasedWidgetInitialization(TextView thisObject, InsertFontTypeFace annotation): set(TextView+ *.*) && @annotation(annotation) && target(thisObject);
两个选项都会在Eclipse中产生“在XXX中定义的建议尚未应用”警告。
任何人都可以对此有所了解吗?
提前致谢。
答案 0 :(得分:0)
好吧,我不认为我有完美的解决方案,但我有一个解决方法,正在做我想要的。这是代码:
pointcut textViewBasedWidgetInitialization(InsertFontTypeFace annotation): set(TextView+ Activity+.*) && @annotation(annotation);
after (InsertFontTypeFace annotation, Object targetObject): textViewBasedWidgetInitialization(annotation) && args(targetObject)
{
if(targetObject != null)
{
TextView widget = (TextView) targetObject;
String pathToFont = annotation.typeFacenamePathInAssets();
if(! EMPTY_STRING.equals(pathToFont))
{
Typeface myTypeface = Typeface.createFromAsset(widget.getContext().getAssets(), pathToFont);
widget.setTypeface(myTypeface);
}
}
}
我只是在截面上捕获设置用@InsertFontTypeFace注释的TextView子类。后来,我建议切入点并捕获args(这将是小部件!!)。我尝试使用this()和target()但他们总是捕获Activity而不是widget。我也试过around()returns()和变体,但我无法使它工作,因为proceed()必须采用与点切割相同数量的参数,我确实需要捕获注释。
嗯,这是一种解决方案。如果有人有更好的贡献我想看到它。