Je dois créer une classe de base qui étend Activity
qui effectue certaines tâches courantes dans mon application et en étends mes activités, sous la forme suivante:
public BaseActivity étend l'activité {....}
public SubActivity étend BaseActivity {...}
dans SubActivity J'ai besoin de donner des valeurs à certaines variables et composants d'interface utilisateur définis dans BaseActivity, je devrai peut-être définir une disposition différente pour SubActivity selon une certaine valeur d'indicateur, également (dans SubActivity) Je veux exécuter une asyncTask qui est définie dans BaseActivity.
est-ce possible? si oui, existe-t-il un tutoriel qui pourrait vous aider? Merci d'avance
Qu'essayez-vous exactement de réaliser? Avoir deux activités différentes avec une interface utilisateur commune, à l'exception de certaines variables ou parties de la mise en page?
Dans ce cas, je suggère d'avoir une activité abstraite de base et deux sous-classes héritées concrètes. Vous définissez tous les comportements courants dans l'activité de base et disposez de méthodes abstraites pour les différences, que vous remplacez ensuite dans vos implémentations réelles.
Par exemple, pour deux activités avec des ressources de mise en page différentes:
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;
}
}
Vous pouvez avoir beaucoup plus de méthodes abstraites, pour chaque bit que vous souhaitez spécifique à vos sous-classes.
Faire cela est, à mon avis, beaucoup mieux que d'avoir une sous-classe concrète à une superclasse concrète: cela peut entraîner de nombreux problèmes et est généralement difficile à déboguer.
Cette question a déjà de très bonnes réponses.
Toutefois. ma réponse est pour ceux qui recherchent un exemple de travail.
Voici le fonctionnement complet -> CODE
Nous ne faisons rien de nouveau ici, c'est comme n'importe quel autre scénario d'héritage (vous voulez un comportement commun à plusieurs endroits mais vous ne voulez écrire ce comportement qu'une seule fois).
AVANTAGE: Il offre une meilleure lisibilité, maintenabilité et bla bla du code. Mais ne recherchent pas ces capacités, elles n'auront aucune importance pour vous si votre cerveau fonctionne comme une gazelle.
Nous recherchons le véritable pouvoir de l'héritage "CONTROL" . (C’est aussi ce qui se passe dans la vraie vie. Un parent contrôle l’enfant :)).
Dans mon exemple, j'ai deux activités MainActivity et OtherActivity. Les deux activités ont une disposition différente, mais je veux que les deux commencent par une animation ou un message de bienvenue.
Notre première tâche est de découvrir le comportement commun. ici -> Commencez l'activité avec une animation.
Nous avons trouvé la "chose" courante, maintenant nous allons écrire ce comportement dans BaseClass ( AnimationActivity ).
MainActivity et OtherActivity hériteront AnimationActivity.
Ainsi, le code ressemblerait à `
BaseActivity
AnimationActivity {
startAnimation()
{
....
}
}
Activités enfants
MainActivity extends AnimationActivity{
}
OtherActivity extends AnimationActivity{
}
Cette approche de conception offre beaucoup de contrôle et flexibilité (PUISSANCE DU MODIFICATEUR ).
1) CONTRÔLE: Gardez la méthode d'animation à l'intérieur de onCreate () Lorsque vous décidez que les activités doivent être démarrées avec Animation. Conservez votre méthode dans la méthode onCreate (Bundle bundle). Maintenant, juste en changeant le modificateur, vous pouvez contrôler les activités enfants.
Si vous conservez le modificateur comme
final: Les activités des enfants commenceront par l'animation des parents.
résumé: Les activités des enfants devront donner leur propre animation.
aucun modificateur: les activités enfants peuvent avoir leur propre animation en remplaçant la méthode d'animation, sinon l'enfant aura l'animation parent.
2) Flexibilité: Ne conservez pas la méthode d'animation dans onCreate () Vous pouvez fournir la flexibilité des activités enfants en ne gardant pas la méthode d'animation dans onCreate (Bundle bundle). Désormais, les activités peuvent avoir la flexibilité d'avoir une animation parent ou leur propre animation ou pas d'animation du tout.
J'espère que ça aide.
Bon apprentissage.
"
Oui, vous devez simplement garder à l'esprit les règles de base en matière d'héritage. Vous hériterez de l'activité AsyncTask interne et des propriétés définies dans la BaseActivity si vous les rendez protégés au lieu de privés. D'après ce que je vois maintenant, je pense que vous devriez faire de BaseActivity une classe abstraite, car seules les instances de sous-activités seront réellement utilisées.
Vous devriez juste commencer et l'essayer, cela viendra et fonctionnera plus facilement que vous ne le pensez. Si vous rencontrez des problèmes, demandez simplement.
J'ai trouvé un moyen plus simple d'accéder à la solution de @ Guillaume. Définissez ContentView
une seule fois dans votre BaseActivity
et ne le définissez pas dans les activités qui le prolongent:
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.
}
}