2013-09-01 14 views
6

Ho qualche problema a sviluppare attività con AndroidAnnotations. Ho un genitore attività di nome TemplateActivity:Attività di ereditarietà con 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)); 
    } 
} 

E nella mia seconda attività, voglio riempire mainFrameLayout con anoter XML di layout simile:

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

     setMainView(R.layout.activity_child_one);  
    } 
} 

Quando voglio startActivity, il mio ChildActivity è vuoto e postInit non è mai stato chiamato. Qualcuno può dirmi cosa c'è che non va? Grazie in anticipo.

+0

Prima di tutto, non utilizzare 'System.out.println (" postInit ");'. Usa 'Log.d (" DEBUG "," postInit ");' invece. Adesso vedi l'output in Logcat? Secondo, 'setMainView (int)' è un metodo che hai creato? Puoi pubblicare il suo codice qui? – Vikram

+0

Right for Log. Sì, ho creato setMainView, l'ho aggiunto alla domanda. – ludriv

+0

Non ho familiarità con 'AndroidAnnotations'. Ma, non dovrebbe postInit() in ChildActivity essere annotato con '@ AfterViews'? – Vikram

risposta

6

L'annotazione nella classe padre risulterà in una classe TemplateActivity_ con il layout specificato. La classe figlio erediterà il materiale "normale" da quella classe genitore, ma avrà la sua sottoclasse AA (ChildActivity_). Quindi dovresti specificare il layout da usare anche lì. Basta dare un'occhiata alle classi generate per vedere cosa sta succedendo lì.

AA funziona generando una nuova sottoclasse per le classi annotate (ad esempio TemplateActivity_ estende TemplateActivity) che contiene il codice necessario per ottenere i risultati delle annotazioni. Ad esempio, in questa classe il metodo onCreate() istanzia il layout necessario, i metodi annotati con @Background vengono sostituiti con un'altra implementazione che chiama il metodo originale in un thread in background. AndroidAnnotations in realtà non fa nulla in fase di esecuzione, tutto può essere visto nelle classi che genera, basta guardare nella cartella .apt_generated (o ovunque tu abbia generato le classi). Questo può anche essere utile se non fa esattamente quello che vuoi, perché puoi semplicemente dare un'occhiata a quello che fa e farlo da solo nel modo in cui ne hai bisogno.

Nel tuo caso, la gerarchia di ereditarietà è come questo:

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 non tutte le annotazioni vengono passati alle sottoclassi.

+0

Grazie per la risposta. Puoi spiegarmi un po 'di più, per favore. Cosa intendi quando parli della sottoclasse "AA"? – ludriv

+0

Hai ragione, non tutte le annotazioni vengono passate alle sottoclassi. Penso che l'annotazione @EActivity sostituisca la vista del contenuto principale della classe genitore (qui TemplateActivity). E a causa di ciò, nessun layout è allegato nella visualizzazione del contenuto. C'è un'altra soluzione per la visualizzazione dei modelli con AA? – ludriv

+3

Copia il codice generato per la creazione della vista da TemplateActivity_.onCreate() e spostalo su TemplateActivity.onCreate(). Elimina le informazioni di layout dall'annotazione – koljaTM

0

Penso che dovresti rendere TempleteActivity una classe astratta.

+0

Grazie per aver risposto, ci ho provato ma non cambia più. – ludriv

2

Utilizzare @EActivity (R.layout.activity_child_one) nella classe figlio e rendere astratta la classe genitore. Questo sta funzionando per me.