android jak stworzyć własną aktywność i ją rozszerzyć?

Muszę utworzyć klasę bazową, która rozszerza Activity, która wykonuje niektóre typowe zadania w mojej aplikacji i rozszerza z niej moje Działania , w następującej formie:

public BaseActivity rozszerza aktywność{....}

public SubActivity extends BaseActivity{...}

W SubActivity muszę podać wartości niektórym zmiennym i elementom interfejsu użytkownika zdefiniowanym w BaseActivity , być może będę musiał zdefiniować inny układ dla SubActivity zgodnie z pewną wartością znacznika, również(w SubActivity ) chcę wykonać asyncTask, który jest zdefiniowany w BaseActivity.

Czy to możliwe? jeśli tak, czy jest jakiś tutorial, który może pomóc? z góry dziękuję
Author: N J, 2012-01-11

4 answers

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

W tym przypadku sugeruję posiadanie podstawowej abstrakcyjnej aktywności i dwóch konkretnych odziedziczonych podklas. Definiujesz wszystkie typowe zachowania w podstawowej aktywności i masz abstrakcyjne metody różnic, które następnie nadpisujesz w swoich rzeczywistych implementacjach.

Na przykład dla dwóch czynności o różnym układzie zasoby:

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żesz mieć o wiele bardziej abstrakcyjne metody, dla każdego bitu, który chcesz przypisać do podklasy.

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

 132
Author: Guillaume,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-11 15:02:09

Tak, możesz, powinieneś po prostu pamiętać o podstawowych zasadach dziedziczenia. Będziesz dziedziczyć wewnętrzną aktywność AsyncTask i właściwości zdefiniowane w BaseActivity, jeśli uczynisz je chronione zamiast prywatnych. Z tego, co teraz widzę, myślę, że powinieneś uczynić BaseActivity klasą abstrakcyjną, ponieważ tylko przypadki subActivities będą naprawdę używane.

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

 5
Author: J. Maes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-11 14:54:46

To pytanie ma już bardzo dobre odpowiedzi.
Jednak. moja odpowiedź jest dla tych ludzi, którzy szukają jakiegoś przykładu pracy.
Oto pełna praca -> kod

Tutaj wpisz opis obrazka
Nie robimy tu nic nowego, jest to jak każdy inny scenariusz dziedziczenia(chcesz mieć jakieś wspólne zachowanie w wielu miejscach, ale chcesz napisać to zachowanie tylko raz).

Korzyść: Zapewnia lepszą czytelność kodu, Konserwacja i bla bla. Ale nie są po tych-ibility, nie będzie miało znaczenia dla Ciebie, jeśli twój mózg działa jak gazela.
Jesteśmy po prawdziwej mocy dziedziczenia "kontroli" . (Tak też dzieje się w prawdziwym życiu. Rodzic kontrolujący dziecko :)).

W moim przykładzie, mam dwie aktywności MainActivity i Inneactivity. Oba działania mają inny układ, ale chcę, aby oba zaczęły się od animacji lub wiadomości powitalnej.

Naszym pierwszym zadaniem jest znalezienie z pospolitego zachowania. tutaj - > rozpocznij aktywność z animacją.
Znaleźliśmy powszechną "rzecz", teraz napiszemy to zachowanie w BaseClass (AnimationActivity ).
MainActivity i Inneactivity odziedziczą AnimationActivity.

Więc kod będzie wyglądał następująco "

BaseActivity

AnimationActivity {

  startAnimation()
  {  
    ....  
  } 
}

Zajęcia Dla Dzieci

MainActivity extends AnimationActivity{

}

OtherActivity extends AnimationActivity{

}

To podejście projektowe zapewnia wiele kontroli i elastyczności (moc MODYFIKATORA).

1) Kontrola: Zachowaj metodę animacji wewnątrz onCreate() Kiedy zdecydujesz, że działania należy rozpocząć od animacji. Zachowaj metodę wewnątrz metody onCreate (Pakiet wiązki). Teraz po prostu zmieniając modyfikator, możesz kontrolować działania dziecka.
Jeśli zachowasz modyfikator jako
finał: zajęcia dla dzieci rozpoczną się od animacji dla rodziców.
abstract: zajęcia dla dzieci będą musiały dać własną animację.
bez modyfikatora: zajęcia dla dzieci mogą mieć własne animacja poprzez nadpisanie metody animacji, w przeciwnym razie dziecko będzie miało animację rodzica.

2)elastyczność: nie przechowuj metody animacji wewnątrz onCreate() Możesz zapewnić dziecku elastyczność działań, nie trzymając metody animacji wewnątrz onCreate(pakiet pakietu). Teraz działania mogą mieć elastyczność, aby mieć animację nadrzędną lub własną animację lub w ogóle nie mieć animacji.
Mam nadzieję, że to pomoże.
Szczęśliwej nauki.

`

 5
Author: Rohit Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 17:47:20

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

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.
    }
}
 3
Author: Seagull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-17 14:39:26