android comment créer ma propre Activité et de l'étendre?

je dois créer une classe de base qui étend Activity qui fait quelques tâches communes dans mon application et d'étendre mes activités de celui-ci, dans la forme suivante:

public BaseActivity s'étend de l'Activité{....}

public sous-Activité s'étend BaseActivity{...}

dans Sous-activité je dois donner des valeurs à certaines variables et composantes D'UI définies dans BaseActivity , je peux avoir besoin de définir une mise en page différente pour SubActivity selon une valeur de drapeau, aussi(dans SubActivity ) je veux exécuter asyncTask qui est défini dans BaseActivity .

est-ce possible? si oui, est-il un tutoriel qui peut vous aider? je vous remercie à l'avance

65
demandé sur N J 2012-01-11 18:48:53

4 réponses

Qu'est-ce que vous essayez d'accomplir exactement? Avoir deux activités différentes avec une interface 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 communs dans l'activité de base, et avez des méthodes abstraites pour les différences, que vous annulez ensuite dans vos implémentations réelles.

Par exemple, pour deux activités avec différentes ressources de mise en page:

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 peu que vous voulez spécifique à vos sous-classes.

faire cela est, à mon avis, beaucoup mieux que d'avoir une sous-classe de béton à une superclasse de béton: cela peut conduire à de nombreux problèmes et est généralement difficile à déboguer.

132
répondu Guillaume 2012-01-11 15:02:09

Oui, vous pouvez, vous devez juste garder à l'esprit la base de règles d'héritage. Vous hériterez de L'activité AsyncTask interne et des propriétés définies dans L'activité de base si vous les protégez au lieu de les rendre privées. De ce que je vois maintenant, je pense que vous devriez faire de la BaseActivity une classe abstraite, car seules les instances de sous-activités seront réellement utilisées.

Vous devriez commencer juste et de l'essayer, ça va venir et le travail plus facile que vous le pensez. Si vous rencontrez des problèmes, il suffit de demander.

5
répondu J. Maes 2012-01-11 14:54:46

Cette question a déjà de très bonnes réponses.

Cependant. ma réponse s'adresse aux personnes qui cherchent un exemple pratique.

voici le plein fonctionnement - > CODE

enter image description here

Nous ne faisons rien de nouveau ici, il est juste comme n'importe quel autre scénario d'héritage (vous voulez un certain commun comportement à plusieurs endroits, mais vous voulez écrire que le comportement qu'une seule fois).

avantage: Il fournit une meilleure lisibilité du code, maintenabilité et bla bla. Mais ne sont pas à la recherche de cette noblesse, ils ne vous importeront pas si votre cerveau fonctionne comme une gazelle.

Nous sommes après le pouvoir réel de l'héritage "contrôle . (C'est aussi ce qui se passe dans la vraie vie. Parent contrôlant l'enfant :)).

dans mon exemple, j'ai deux activités MainActivity et OtherActivity. Les deux activités ont une mise en page différente, mais je veux que les deux commencent par une animation ou un message de bienvenue.

Notre première tâche est de trouver le comportement commun. ici - > commencez L'activité avec l'animation.

Nous avons trouvé la "chose" commune, maintenant nous allons écrire ce comportement dans la classe de base ( AnimationActivity ).

activité principale et autres activités hériteront de L'activité D'animation.

donc le code ressemblerait à

BaseActivity

AnimationActivity {

  startAnimation()
  {  
    ....  
  } 
}

Activités Pour Enfants

MainActivity extends AnimationActivity{

}

OtherActivity extends AnimationActivity{

}

cette approche de conception fournit beaucoup de contrôle et flexibilité (puissance du modificateur).

1) de CONTRÔLE: de Conserver l'animation de la méthode onCreate à l'intérieur() Quand vous décidez que les activités doivent être commencées avec L'Animation. Gardez votre méthode dans la méthode onCreate(Bundle bundle). Maintenant, juste en changeant le modificateur, vous pouvez contrôler les Activités enfant.

Si vous gardez le modificateur comme

final: les activités pour les enfants commenceront avec L'Animation pour les parents.

résumé: l'Enfant des activités de donner leur propre animation.

aucun modificateur: les activités de L'enfant peuvent avoir leur propre animation par la méthode d'animation dominante, sinon l'enfant aura une animation parente.

2)flexibilité: ne gardez pas la méthode d'animation à l'intérieur de la création() Vous pouvez fournir la flexibilité des activités de l'enfant en ne gardant pas la méthode d'animation à l'intérieur onCreate (Bundle bundle). Maintenant, les activités peuvent avoir la flexibilité d'avoir une Animation parente ou leur propre animation ou pas d'animation.

Espérons que cela aide.

Heureux d'apprentissage.

`

5
répondu Rohit Singh 2018-10-04 17:47:20

j'ai trouvé un moyen plus facile de trouver la solution de @Guillaume. Mettez ContentView une seule fois dans votre BaseActivity et ne le mettez pas dans les activités qui l'étendent:

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
répondu Seagull 2016-02-17 14:39:26