2013-09-01 3 views
6

Ich habe einige Probleme, um Aktivitäten mit AndroidAnnotations zu erstellen. Ich habe eine übergeordnete Aktivität namens TemplateActivity:Vererbung Aktivität mit AndroidAnnotations

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

Und in meinem zweiten Aktivität, ich will mainFrameLayout mit anoter Layout XML so füllen:

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

     setMainView(R.layout.activity_child_one);  
    } 
} 

Als ich startActivity wollen, mein ChildActivity ist leer und postInit wurde nie aufgerufen. Kann mir jemand sagen, was los ist? Danke für den Fortschritt.

+0

Zunächst nicht 'System.out.println (" postInit ");'. Verwenden Sie stattdessen 'Log.d (" DEBUG "," postInit ");'. Siehst du jetzt die Ausgabe in Logcat? Zweitens, ist 'setMainView (int)' eine Methode, die Sie erstellt haben? Kannst du den Code hier posten? – Vikram

+0

Richtig für Log. Ja, ich habe setMainView erstellt, ich habe es in der Frage hinzugefügt. – ludriv

+0

Ich bin nicht mit AndroidAnnotations vertraut. Aber sollte postInit() in ChildActivity nicht mit '@ AfterViews' versehen werden? – Vikram

Antwort

6

Die Annotation in der übergeordneten Klasse führt zu einer Klasse TemplateActivity_ mit dem angegebenen Layout. Die Kindklasse erbt das "normale" Zeug von dieser Elternklasse, hat aber ihre eigene AA-Unterklasse (ChildActivity_). Sie sollten daher auch das Layout angeben, das dort verwendet werden soll. Sehen Sie sich die generierten Klassen an, um zu sehen, was dort vor sich geht.

AA funktioniert durch Generieren einer neuen Unterklasse für Ihre annotierten Klassen (z. B. TemplateActivity_ extends TemplateActivity), die den Code enthält, der zum Erreichen der Ergebnisse Ihrer Anmerkungen erforderlich ist. In dieser Klasse zum Beispiel instanziiert die Methode onCreate() das benötigte Layout, Methoden, die mit @Background annotiert wurden, werden durch eine andere Implementierung überschrieben, die die ursprüngliche Methode in einem Hintergrundthread aufruft. AndroidAnnotations tut zur Laufzeit nichts wirklich, alles kann in den Klassen gesehen werden, die es generiert, schaue einfach in den .apt_generated-Ordner (oder wo auch immer du die Klassen generiert hast). Dies kann auch hilfreich sein, wenn es nicht genau das tut, was Sie wollen, weil Sie dann einfach einen Blick darauf werfen können, was es tut und es selbst tun, wie Sie es brauchen.

In Ihrem Fall ist die Vererbungshierarchie wie folgt aus:

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 nicht alle Anmerkungen werden auf Unterklassen weitergegeben.

+0

Danke für die Antwort. Können Sie mir bitte etwas mehr erklären? Was meinst du, wenn du von "AA" Subklassen erzählst? – ludriv

+0

Sie haben Recht, nicht alle Anmerkungen werden an Unterklassen weitergegeben. Ich denke, dass @EActivity Annotation die Hauptinhaltsansicht der Elternklasse ersetzt (hier TemplateActivity). Aus diesem Grund ist kein Layout in der Inhaltsansicht angehängt. Gibt es eine andere Lösung für Templates mit AA? – ludriv

+3

Kopieren Sie den generierten Code für die Ansichtserstellung von TemplateActivity_.onCreate() und verschieben Sie ihn in TemplateActivity.onCreate(). Löschen Sie die Layout-Informationen aus der Annotation – koljaTM

0

Ich denke, Sie sollten TempleteActivity eine abstrakte Klasse machen.

+0

Vielen Dank für die Antwort, ich habe es versucht, aber es ändert sich nicht mehr. – ludriv

2

Verwenden Sie @EActivity (R.layout.activity_child_one) in der Kindklasse und machen Sie die Elternklasse abstrakt. Das funktioniert für mich.