0

我的目标是能够注释基于 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 中定义的建议”警告。

任何人都可以对此有所了解吗?

提前致谢。

4

1 回答 1

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);
        }
    }
}

我只是在捕获设置一个 TextView 子类,并在该部分上使用 @InsertFontTypeFace 注释。稍后,我建议切入点并捕获 args(这将是小部件!!)。我尝试使用 this() 和 target() 但它们总是捕获 Activity 而不是小部件。我还尝试了 around() returned() 和变体,但我无法使其工作,因为proceed() 必须采用与切点相同数量的参数,并且我确实需要捕获注释。

嗯,这是一种解决方案。如果有人有更好的贡献,我想看看。

于 2013-06-27T12:01:07.547 回答