2012-01-11 11 views
61

muszę utworzyć klasę bazową, która rozciąga Activity który ma pewne wspólne zadania w mojej aplikacji i przedłużyć z działalności z niego, w następującej postaci:Android jak stworzyć własną działalność i ją rozszerzyć?

BaseActivity publicznego przedłużają działanie {....}

Poddziałanie publicznej rozciąga BaseActivity {...}

w Poddziałanie muszę podawać wartości do pewnych zmiennych i elementów interfejsu użytkownika określonych w BaseActivity, może muszę zdefiniować inny układ dla Poddziałanie według niektórych wartości flagi, a także (w Poddziałanie) Chcę wykonać asyncTask zdefiniowane w BaseActivity.

jest to możliwe? jeśli tak, czy jest jakiś tutorial, który może pomóc? z góry dziękuję

Odpowiedz

127

Co dokładnie próbujesz osiągnąć? Mając dwie różne czynności ze wspólnym interfejsem, z wyjątkiem niektórych zmiennych lub części układu?

W tym przypadku sugeruję posiadanie podstawowego działania abstrakcyjnego i dwóch dziedziczonych podklas konkretnych. Definiujesz wszystkie typowe zachowania w podstawowej aktywności i stosujesz abstrakcyjne metody różnic, które następnie zastępujesz w swoich rzeczywistych implementacjach.

Na przykład, dla dwóch działań z różnych zasobów układ:

public abstract class BaseActivity extends Activity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     setContentView(getLayoutResourceId()); 
    } 

    protected abstract int getLayoutResourceId(); 
} 

public class Activity1 extends BaseActivity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     // do extra stuff on your resources, using findViewById on your layout_for_activity1 
    } 

    @Override 
    protected int getLayoutResourceId() { 
     return R.layout.layout_for_activity1; 
    } 
} 

Można mieć dużo bardziej abstrakcyjnych metod, na każdym kawałku chcesz specyficzny do podklasy.

Jest to, moim zdaniem, o wiele lepsze niż posiadanie konkretnej podklasy do konkretnej nadklasy: może to prowadzić do wielu problemów i zwykle jest trudne do debugowania.

+0

dziękuję bardzo, to jest dokładnie to, czego potrzebowałem. – user173488

+1

Nie ma problemu P) Niedźwiedź Miałem na myśli, że szybko to zakodowałem w edytorze StackOverflow, mogą być błędy składni – Guillaume

+0

dzięki, wziąłem pomysł i zastosowałem go do innych funkcji, danych do przekazania i AsyncTask w BaseActivity, działało dobrze. – user173488

5

Tak, możesz, powinieneś pamiętać podstawowe zasady dotyczące dziedziczenia. Dziedziczone zostanie działanie wewnętrzne AsyncTask i właściwości zdefiniowane w BaseActivity, jeśli zostaną zabezpieczone, a nie prywatne. Z tego, co widzę teraz, myślę, że powinieneś uczynić BaseActivity klasą abstrakcyjną, ponieważ tak naprawdę będą używane tylko przykłady subaktywności.

Powinieneś po prostu zacząć i wypróbować, przyjdzie i będzie działać łatwiej niż myślisz. Jeśli natkniesz się na jakieś problemy, po prostu zapytaj.

2

Znalazłem łatwiejszy sposób na rozwiązanie @ Guillaume. Ustaw ContentView tylko raz w BaseActivity i nie wolno go w działaniach, które je rozciągają:

public abstract class BaseActivity extends Activity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     setContentView(activity_main); 
    } 
} 

public class Activity1 extends BaseActivity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     // setContentView(activity_activity1) // Do NOT call this. 
    } 
} 
+1

wydaje się być zgodny z prawem, ale mam pewne obawy, użytkownik pozostanie w użyciu tylko jeden układ ... jeśli mam 3 widoki wspólne w 3 działaniach diff, ale poza tym wszystkie układy są różne, to myślę, że to rozwiązanie pokonuje cel, powód.... – Juni

2

To pytanie ma już bardzo dobre odpowiedzi.
Moja odpowiedź jest dla osób, które szukają jakiegoś działającego przykładu.
Oto pełna robocza ->CODE

enter image description here
Nie robimy niczego nowego tutaj, to jest tak jak w każdym innym scenariuszu spadkowego (Chcecie jakieś wspólne zachowanie w wielu miejscach, ale chcesz napisać, że zachowanie tylko raz).

zaletę: To ma zapewnić lepszą czytelność kodu, łatwość utrzymania i blah blah.But nie są po tych -ibility, nie będzie miało znaczenia dla Ciebie, jeśli twój mózg działa jak gazela.
Poszukiwaliśmy prawdziwej potęgi dziedziczenia "KONTROLA". (Tak dzieje się również w prawdziwym życiu, rodzic kontrolujący dziecko :)).

W moim przykładzie mam dwie Aktywności Aktywności Głównej i InneJakość. Obie czynności mają inny układ, ale chcę, aby obie zaczynały się od animacji lub wiadomości powitalnej.

Naszym pierwszym zadaniem jest znalezienie wspólnego zachowania. tutaj -> Zacznij aktywność z animacją.
Znaleźliśmy wspólną "rzecz", teraz napiszemy to zachowanie w BaseClass (AnimationActivity).
MainActivity i OtherActivity będą dziedziczyć AnimationActivity.

Więc kod wyglądałby `

BaseActivity

AnimationActivity { 

    startAnimation() 
    { 
    .... 
    } 
} 

dziećmi Zajęcia

MainActivity extends AnimationActivity{ 

} 

OtherActivity extends AnimationActivity{ 

} 

Podejście to konstrukcja zapewnia dużo Sterowanie i Elastyczność (ZASILANIE MODYFIKATORA).

1) KONTROLA: Zachowaj metodę animacji wewnątrz onCreate() Kiedy zdecydujesz, że działania powinny zostać uruchomione z animacją. Zachowaj metodę wewnątrz metody Utwórz aktualizację (pakowanie pakietu). Teraz wystarczy zmienić modyfikator, aby kontrolować działania podrzędne.
Jeśli zachowujesz modyfikator jako
końcowy: Działania podrzędne rozpoczną się od animacji nadrzędnej.
streszczenie: Działania dla dzieci będą musiały dać własną animację.
brak modyfikatora: Działania podrzędne mogą mieć własną animację poprzez przesłonięcie metody animacji, w przeciwnym razie dziecko będzie miało animację nadrzędną.

2) Elastyczność: Nie trzymaj metodę animacji wewnątrz onCreate() Można przewidywać zajęcia dziecko elastyczność, nie utrzymując metodę animacji wewnątrz wiązki onCreate (Bundle). Teraz działania mogą mieć elastyczność, aby mieć animację rodzica lub swoją animację lub animację w ogóle.
Mam nadzieję, że to pomaga.
Szczęśliwe uczenie.

`

Powiązane problemy