2011-01-31 5 views
43

Existe-t-il un moyen de modifier dynamiquement l'activité de démarrage dans Android sur une base conditionnelle? Ce que je tentais de faire (qui ne fonctionne pas) était la suivante:Activité de démarrage dynamique sur Android?

  1. supprimer la catégorie LANCEUR tel que défini dans mon AndroidManifest.xml
  2. créer une classe d'application personnalisée que l'application utilise
  3. override la Méthode onCreate de ma classe Application pour définir du code comme suit:

.

if (condition) { 
    startActivity(new Intent(this, MenuActivity.class)); 
} else { 
    startActivity(new Intent(this, LoginActivity.class)); 
} 
+3

exactement ce que j'ai cherché, je vous remercie de demander cela déjà. – mad

Répondre

56

Pourquoi ne pas avoir une Activity initiale sans interface utilisateur qui vérifie la condition dans son onCreate, lance alors la prochaine Activity, puis appelle finish() sur lui-même? Je n'ai jamais appelé finish() depuis onCreate(), donc je ne sais pas si cela va fonctionner.

EDIT
semble fonctionner très bien. Voici du code pour le rendre plus clair.
initiale Activity:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Intent intent; 
    if (condition) { 
     intent = new Intent(this, ClassA.class); 
    } else { 
     intent = new Intent(this, ClassB.class); 
    } 
    startActivity(intent); 
    finish(); 
    // note we never called setContentView() 
} 

Autres Activity:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 
+0

Pouvez-vous avoir une activité sans interface utilisateur? Je pensais que tout le but d'une activité était d'afficher quelque chose à l'utilisateur, mais peut-être que je dois faire une relecture sur les bases d'Android ... –

+1

@Matt Huggins Je l'ai juste essayé dans mon espace de travail scratch et ça semble fonctionner correctement. –

+1

C'est le but d'une activité, mais il y a beaucoup de façons de contourner cela. Je pense que ce que Dave voulait dire, c'est juste ne pas déclarer une interface utilisateur. Rien ne vous oblige à appeler setContentView ou quoi que ce soit d'autre. Faites votre chèque, commencez votre prochaine activité et continuez avec. – Falmarri

8

Voici ce que je l'ai fait personnellement l'un de mes petits projets mobiles. Au lieu de créer une procédure distincte, écran moins Activity où la condition est et qui lance l'écran correspondant, je mets la condition dans un Activity et fait une setContentView() dynamique, comme dans:

if (!userIsLoggedIn) { 
    setContentView(R.layout.signup); 
} else { 
    setContentView(R.layout.homescreen); 
} 

Deux remarques importantes à cette approche :

1: Au lieu d'écrire cela dans onCreate(), vous voulez mettre la prise de décision à l'intérieur onResume() précisément parce que ce dernier est toujours appelé chaque fois que l'écran doit être affiché à l'avant. Vous pouvez voir cela à partir de l'Android activity life cycle. Si, par exemple, l'utilisateur vient de télécharger mon application et la lance pour la première fois, parce qu'aucun utilisateur n'est connecté, elle sera redirigée vers la page d'inscription. Quand elle a fini de s'inscrire et pour une raison quelconque appuie sur le bouton HOME (pas BACK, qui ferme complètement l'application!) Et reprend l'application, la mise en page qu'elle va voir est déjà celle de l'écran d'accueil. Si je mets le conditionnel à l'intérieur onCreate(), ce qui aurait été affiché est l'écran d'inscription parce que, selon le cycle de vie, il ne revient pas à onCreate() lorsque l'on ramène une application à l'avant. 2: Cette solution n'est idéale que si la fusion des fonctionnalités de ces deux activités ne produirait pas un long bloc de code diabolique. Comme je l'ai dit, mon projet était petit (sa caractéristique principale se situe en arrière-plan), de sorte que le Activity dynamique unique n'en avait pas trop. Le Activity sans écran est certainement la voie à suivre si vous avez besoin de votre code pour être plus lisible par l'homme.

+3

+1 pour partager une autre méthode. :) Comme vous l'avez déjà mentionné, ma seule préoccupation avec cette méthode est que chaque vue peut nécessiter un ensemble de code sous-jacent largement différent, ce qui rendrait l'activité volumineuse et incongrue. –

+1

@MattHuggins cette solution fonctionne probablement mieux si vous utilisez 'Fragment's qui encapsule le' contentView' et le "ensemble de code sous-jacent largement différent". – TWiStErRob

Questions connexes