2012-01-11 14 views
61

Ho bisogno di creare una classe di base che si estende Activity che fa alcune attività comuni nella mia applicazione e ampliare le mie attività da esso, nella forma seguente:android come creare la mia attività ed estenderla?

BaseActivity pubblica si estende Activity {....}

subattività pubblica si estende BaseActivity {...}

in subattività devo dare valori di alcune variabili e componenti dell'interfaccia utente definiti in BaseActivity, I può essere necessario definire un diverso layout per subattività secondo alcuni valore di flag, anche (in subattività) voglio eseguire AsyncTask definito in BaseActivity.

è possibile? se sì, c'è qualche tutorial che può aiutare? grazie in anticipo

risposta

127

Che cosa stai cercando di ottenere esattamente? Avere due diverse attività con un interfaccia utente comune, ad eccezione di alcune variabili o parti del layout?

In questo caso, suggerisco di avere un'attività di base astratta e due sottoclassi di cemento ereditate. Definisci tutti i comportamenti comuni nell'attività di base e disponi di metodi astratti per le differenze, che poi sovrascrivi nelle tue implementazioni effettive.

Ad esempio, per le due attività con diverse risorse di layout:

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

Si può avere un sacco metodi più astratti, per ogni bit che si desidera specifico per le vostre sottoclassi.

Fare questo è, a mio parere, molto meglio che avere una sottoclasse di cemento per una superclasse di cemento: questo può portare a molti problemi e di solito è difficile eseguire il debug.

+0

Grazie mille, questo è esattamente ciò di cui avevo bisogno. – user173488

+1

Nessun problema P) Tenete presente che ho programmato rapidamente nell'editor di StackOverflow, potrebbero esserci errori di sintassi – Guillaume

+0

grazie, ho preso l'idea e l'ho applicata ad altre funzioni, dati da passare e AsyncTask in BaseActivity, ha funzionato bene. – user173488

5

Sì, è possibile, basta tenere a mente le regole di ereditarietà di base. Si erediterà l'attività AsyncTask interna e le proprietà definite in BaseActivity se le si rende protette anziché private. Da quello che vedo ora penso che dovresti rendere BaseActivity una classe astratta, dato che verranno utilizzate solo le istanze di subActivities.

Si dovrebbe solo iniziare e provarlo, arriverà e funzionerà più facilmente di quanto si pensi. Se incappi in qualche problema, basta chiedere.

2

Ho trovato un modo più semplice per la soluzione di @Guillaume. Impostare ContentView una sola volta nella BaseActivity e non impostare nelle attività che si estendono esso:

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

sembra legittimo, ma ho qualche preoccupazione, l'utente sarà lasciato ad usare un solo layout ... se ho 3 viste comuni in 3 attività di diff ma a parte che tutti i layout sono diversi allora suppongo che questa soluzione sconfigga scopo.... – Juni

2

Questa domanda ha già molto buone risposte.
La mia risposta è per quelle persone che cercano un esempio funzionante.
Ecco il pieno funzionamento ->CODE

enter image description here
Non stiamo facendo nulla di nuovo qui, è proprio come qualsiasi altro scenario eredità (Volete un comportamento comune a più posti, ma si desidera scrivere che comportamento solo una volta).

VANTAGGIO: Esso fornisce una migliore leggibilità del codice, manutenibilità e bla blah.But non sono dopo questi -ibility, Essi non importa a voi se il vostro cervello funziona come una gazzella.
Ci occupiamo del vero potere dell'eredità "CONTROLLO". (Questo è quello che succede anche nella vita reale. Genitore che controlla il bambino :)).

Nel mio esempio ho due attività MainActivity e OtherActivity. Entrambe le attività hanno un layout diverso ma voglio che entrambe inizino con qualche animazione o qualche messaggio di benvenuto.

Il nostro primo compito è scoprire il comportamento comune. qui -> Avvia attività con animazione.
Abbiamo trovato la "cosa" comune, ora scriveremo questo comportamento in BaseClass (AnimationActivity).
MainActivity e OtherActivity erediteranno AnimationActivity.

Quindi il codice sarebbe simile a `

BaseActivity

AnimationActivity { 

    startAnimation() 
    { 
    .... 
    } 
} 

attività per bambini

MainActivity extends AnimationActivity{ 

} 

OtherActivity extends AnimationActivity{ 

} 

Questo approccio progettuale fornisce un sacco di Controllo e Flessibilità (POTENZA DEL MODIFICATORE).

1) CONTROLLO: Tenere metodo di animazione all'interno onCreate() Quando si decide che le attività deve essere iniziato con animazione. Mantieni il tuo metodo all'interno del metodo onCreate (Bundle bundle). Ora semplicemente cambiando il modificatore puoi controllare le Attività minori.
Se si mantiene il modificatore come
final: le attività figlio inizieranno con Animazione principale.
abstract: Le attività secondarie dovranno dare la propria animazione.
no modificatore: le attività figlio possono avere la propria animazione sostituendo il metodo di animazione, altrimenti il ​​bambino avrà l'animazione principale.

2) Flessibilità: Non tenere metodo animazione all'interno onCreate() È possibile fornire attività figlio flessibilità non tenere il metodo di animazione all'interno onCreate (bundle bundle). Ora le attività possono avere la flessibilità di avere animazione principale o propria animazione o nessuna animazione.
Spero che aiuti.
Buon apprendimento.

`

Problemi correlati