AndroidAnnotations的继承活动

时间:2013-09-01 22:41:05

标签: android android-activity android-annotations

使用AndroidAnnotations构建活动时遇到一些麻烦。 我有一个名为TemplateActivity的父Activity:

@EActivity(R.layout.activity_template)
@NoTitle
public class TemplateActivity extends Activity
{
    // some views
    // ...
    @ViewById(R.id.main_framelayout)
    FrameLayout mainFrameLayout;

    @AfterViews
    public void postInit()
    {
        Log.d("DEBUG", "postInit"); // never called, strange... 
    }

    public void setMainView(int layoutResID)
    {
        mainFrameLayout.addView(LayoutInflater.from(this).inflate(layoutResID, null));
    }
}

在我的第二个Activity中,我想用anoter layout xml填充mainFrameLayout,如下所示:

@EActivity
public class ChildActivity extends TemplateActivity
{
    @Override
    public void postInit()
    {
        super.postInit();

        setMainView(R.layout.activity_child_one);       
    }
}

当我想要startActivity时,我的ChildActivity是空白的,并且从未调用过postInit。 谁能告诉我有什么问题?谢谢你的进步。

3 个答案:

答案 0 :(得分:7)

父类中的注释将生成具有指定布局的TemplateActivity_类。子类将继承该父类的“普通”内容,但具有自己的AA子类(ChildActivity_)。所以你应该指定在那里使用的布局。只需看看生成的类,看看那里发生了什么。

AA的工作原理是为带注释的类生成一个新的子类(例如TemplateActivity_ extends TemplateActivity),其中包含实现注释结果所需的代码。例如,在此类中,onCreate()方法将实例化所需的布局,使用@Background注释的方法将被另一个在后台线程中调用原始方法的实现覆盖。 AndroidAnnotations在运行时并没有真正做任何事情,所有内容都可以在它生成的类中看到,只需查看.apt_generated文件夹(或者生成类的任何地方)。如果它不能完全按照您的意愿行事,这也会有所帮助,因为您可以只看看它的功能,并以您需要的方式自行完成。

在您的情况下,继承层次结构如下:

TemplateActivity (with annotations)
L--> TemplateActivity_ (with generated code for the layout)
L--> ChildActivity (your other class, no generated code)
     L--> ChildActivity_ (with code generated for the annotations in ChildActivity)

Afaik并非所有注释都传递给子类。

答案 1 :(得分:2)

在子类中使用@EActivity(R.layout.activity_child_one)并使父类成为抽象。这对我有用。

答案 2 :(得分:0)

我认为你应该让TempleteActivity成为一个抽象类。