2013-09-01 19 views
6

Mam problem z budowaniem aktywności z AndroidAnnotations. mam rodzic aktywny nazwie TemplateActivity:Dziedziczenie z 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)); 
    } 
} 

I w moim drugim Aktywny, chcę wypełnić mainFrameLayout z anoter xml układ tak:

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

     setMainView(R.layout.activity_child_one);  
    } 
} 

Kiedy chcę startActivity, mój ChildActivity jest puste i postInit nigdy nie był wywoływany. Czy ktoś może mi powiedzieć, co jest nie tak? Dzięki za zaliczkę.

+0

Przede wszystkim nie używaj 'System.out.println (" postInit ");'. Zamiast tego użyj 'Log.d (" DEBUG "," postInit ");'. Czy widzisz teraz dane wyjściowe w Logcat? Po drugie, czy 'setMainView (int)' jest metodą, którą utworzyłeś? Czy możesz umieścić tutaj swój kod? – Vikram

+0

Prawo do dziennika. Tak, stworzyłem setMainView, dodałem go do pytania. – ludriv

+0

Nie jestem zaznajomiony z "AndroidAnnotations". Ale czy postInit() w ChildActivity nie powinien mieć adnotacji z '@ AfterViews'? – Vikram

Odpowiedz

6

Adnotacja w klasie nadrzędnej spowoduje, że klasa TemplateActivity_ z określonym układem. Klasa potomna dziedziczy "normalne" rzeczy z tej klasy macierzystej, ale ma własną podklasę AA (ChildActivity_). Dlatego powinieneś również określić układ, który będzie tam używany. Wystarczy spojrzeć na wygenerowane klasy, aby zobaczyć, co się tam dzieje.

AA działa poprzez generowanie nowej podklasy dla twoich przypisanych klas (np. TemplateActivity_ extends TemplateActivity), która zawiera kod niezbędny do uzyskania wyników adnotacji. Na przykład w tej klasie metoda onCreate() tworzy instancję wymaganą, a metody opatrzone adnotacją @Background zostaną zastąpione inną implementacją wywołującą oryginalną metodę w wątku tła. AndroidAnnotations tak naprawdę nie robi nic w czasie wykonywania, wszystko można zobaczyć w generowanych przez siebie klasach, wystarczy zajrzeć do folderu .apt_generated (lub gdziekolwiek wygenerowano klasy). Może to być pomocne, jeśli nie robi to, co chcesz, ponieważ możesz wtedy spojrzeć na to, co robi, i zrobić to sam w sposób, w jaki jest to potrzebne.

W twoim przypadku, hierarchia dziedziczenia jest tak:

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 nie wszystkie adnotacje są przekazywane do podklasy.

+0

Dzięki za odpowiedź. Czy możesz mi wyjaśnić trochę więcej, proszę. Co masz na myśli mówiąc o podklasie "AA"? – ludriv

+0

Masz rację, nie wszystkie adnotacje są przekazywane do podklas. Myślę, że adnotacja @EActivity zastępuje główny widok zawartości klasy nadrzędnej (tutaj TemplateActivity). Z tego powodu w widoku treści nie jest dołączany żaden układ. Czy istnieje inne rozwiązanie w szablonowym widoku z AA? – ludriv

+3

Skopiuj wygenerowany kod do utworzenia widoku z TemplateActivity_.onCreate() i przenieś go do TemplateActivity.onCreate(). Usuń informacje o układzie z adnotacji. – koljaTM

0

Myślę, że powinieneś sprawić, że TempleteActivity będzie klasą abstrakcyjną.

+0

Dziękuję za odpowiedź, próbowałem, ale to już nie zmienia. – ludriv

2

Użyj @Activity (R.layout.activity_child_one) w klasie potomnej i przekształć klasę nadrzędną w streszczenie. To działa dla mnie.