2011-04-22 1 views
0

peut être son trop simple mais je ne pouvais pas trouver le bon chemin.Java onCreate avec paramètre comme dans initWithParameter C++

En C++, je peux écrire initWithParameter: xxx pour instancier une classe, puis dans l'init certaines variables d'instance étant donné la valeur au moment de l'initialisation.

En Java, je ne sais pas comment faire cela. Actuellement, je fais ce qui suit:

public class SpecialScreen extends BASEScreen{ 
private static final int ACTIVITY_1 = 1; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); //create the instance 
    defineScreenType (ACTIVITY_1); //second call to set the instance variable 
    presentOnScreen(); 
} 

Alors que dans BASEScreen:

public class BASEScreen extends Activity { 
private Integer activityCode; // which activity should I do? 

@Override 
public void onCreate(Bundle savedInstanceState) { // the creation 
    super.onCreate(savedInstanceState); 
} 

// the setting of the instance variable 
public void defineScreenType(int screenID) { 
    activityCode = screenID; 

} 

Ce ne peut pas être la meilleure façon de le faire. Comment faire mieux?

Merci

AJOUTÉE pour montrer l'appel du SpecialScreen au sein BASEScreen:

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    Intent i; 
    switch (item.getItemId()) { 
    case OTHER_PAGE_ID: 
     // 
     if (activityCode == ACTIVITY_1) { 
      i = new Intent(this, SpecialScreen2.class); 
      i.putExtra("Task", ACTIVITY_2); 
      startActivityForResult(i, ACTIVITY_2); 
      finish(); 

     } else { 
      i = new Intent(this, SpecialScreen1.class); 
      i.putExtra("Task", ACTIVITY_1); 
      startActivityForResult(i, ACTIVITY_1); 
      finish(); 
     } 

     return true; 

ps je sais que mettre Extra n'est plus nécessaire. C'était la façon dont je l'ai fait avant que j'avais les deux sous-classes SpecialScreen et toujours appelé BASEScreen avec ce paramètre.

+1

Détesté comme une question android, car c'est ce qu'il semble être. –

+0

@ user387184: Qu'essayez-vous de faire? Quelque chose comme 'utilisateur appuie sur le bouton 1, démarrer l'activité 1', 'utilisateur appuie sur le bouton 2, démarrer l'activité 2'? Commencer différentes activités en fonction du choix de l'utilisateur ou d'une autre condition? – Squonk

+0

oui c'est vrai – user387184

Répondre

2

Correct, il n'y a pas de syntaxe "par défaut" comme en C++. Vous devez le faire dans le constructeur. Rappelez-vous, vous n'avez pas besoin d'utiliser la méthode setter, vous pourriez faire activityCode protégé plutôt que privé, et faites juste:

activityCode = ACTIVITY_1; 

L'autre option utilise le modèle Builder pour construire vos objets, en utilisant un ensemble des valeurs par défaut à l'intérieur du constructeur que vous remplacez (si nécessaire) lors de la demande de construction de l'objet.

Modifier en réponse aux commentaires ci-dessous:

Je présente mes excuses pour une certaine confusion que j'appelle un « constructeur » quand il est pas.

Si dans BASEScreen vous modifiez l'accès à protected de private

public class BASEScreen extends Activity { 
    protected Integer activityCode; 

Vous pouvez alors accéder que dans la sous-classe SpecialScreen:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    activityCode = 1; // Or ACTIVITY_1 if you'd like 
    presentOnScreen(); 
} 
+0

Désolé, aussi ici je ne suis pas sûr En comprendre pleinement. Où dois-je définir le code d'activité? Je dois le faire à l'intérieur de l'écran BASES droite? Donc, je devrais le passer comme John Munsch a écrit ci-dessus? S'il vous plaît expliquer ... Merci – user387184

+0

Désolé, voir mon édition ci-dessus. Je ne faisais pas assez attention à votre exemple de code car vous n'appelez pas un constructeur directement. –

+0

Oh ok, je comprends, ça va le faire - merci! – user387184

2

Si je comprends bien votre question. Toute classe en Java peut avoir un ou plusieurs constructeurs. Chacun peut avoir soit aucun paramètre, soit un ensemble de paramètres que vous passez (bien qu'ils aient chacun un ensemble/un ordre unique pour que le compilateur puisse dire lequel vous avez l'intention d'utiliser).

public class SpecialScreen extends BASEScreen { 
    private static final int ACTIVITY_1 = 1; 

    // There is a default constructor with no parameters provided for you 
    // by default if you don't define any constructors. 
    public SpecialScreen() { 
     // I'm overriding the default constructor and this one will do 
     // something else. 
     super(ACTIVITY_1); 
    } 

    // But you can also have ones like this. 
    public SpecialScreen(int activity) { 
     super(activity); 
    } 
} 

Chacun d'eux est invoquée lorsque vous effectuez une nouvelle, par exemple:

BASEScreen = new SpecialScreen porcupine(); // Aucun constructeur de paramètre.

ou

BASEScreen épic = new SpecialScreen (5); // Constructeur qui prend le paramètre.

+0

Désolé, ne l'obtenez pas vraiment. Où est ma variable activityCode définie pour l'objet créé? L'objet créé a besoin de savoir quel type d'écran il est réellement - qu'est-ce qui me manque ici? – user387184

Questions connexes