Aller au contenu

TabActivity et action sur changement de tab


Julien41

Recommended Posts

Bonsoir ...

J'ai un soucis sur le développement de mon appli. Je pense que le code seul vous suffira à voir le couac, mais je fais quand même un petit descriptif de la structure au cas où :

J'ai une TabActivity qui démarre trois sous-activities dans trois onglets.

Le traitement du dernier onglet dépend des deux autres, je ne peux donc pas effectuer ce traitement dans le onCreate. Je mets donc un OnTabChangeListener dans ma TabActivity, qui appelle une méthode helper effectuant le traitement dès que je me place sur le troisième onglet ( en supposant être passé par les deux premiers)

Les données dépendant des deux autres onglets sont mis en Extra dans l'intent de la troisième.

Dans la troisième, je fais Intent i = getIntent() dans onCreate, puis dans ma méthode helper je fais i.getExtras(); puis je récupère mes données.

Le soucis : la méthode helper (implémentée dans la 3eme classe) fait planter l'appli quand elle est appelée, même seulement avec un toast (en mettant en contexte, le contexte de la 3eme activity récupéré via getApplicationContext ).

Mon interprétation : la 3ème classe est instanciée au lancement de l'appli lors de la mise en place des onglets ( setClass, setContent ), or, lors de mon appel à ma méthode helper dans ma TabActivity, je crée une nouvelle instance de ma 3eme classe qui n'est pas celle instanciée au démarrage, et qui ne correspond pas à la sous-activity de mon onglet. Du coup, il plante dès que je veux faire un affichage, car il ne connait pas mes Views.

J'espère ne pas avoir été trop confus.

Comment je peux résoudre ce problème ?

Cdlt,

Julien.

Le code le plus simple qui plante déjà :

Dans le onCreate de la TabActivity :

 tabHost.setOnTabChangedListener(new OnTabChangeListener() {
    	   @Override
    	  public void onTabChanged(String tabId) {
    		   if (tabId == "affichage") {
    			   Affichage monAffichage = new Affichage();  //nouvelle instance de la troisième classe
    			   monAffichage.selected();                 //appel de la méthode helper pour traitement
    		   }
    	   }     
    	       });  

Et dans ma troisième classe :

public class Affichage extends Activity{
   WebView  wv;
public void onCreate(Bundle savedInstanceState) {
   	super.onCreate(savedInstanceState);
       setContentView(R.layout.affichage);

}

public void selected() {

wv = (WebView) findViewById(R.id.WebView);
wv.loadUrl("http://www.google.fr");
}

Lien vers le commentaire
Partager sur d’autres sites

L'instanciation d'une Activity doit être faite par le système, et non par ton propre code. Ce que tu fais donc dans le onTabChanged n'est pas correct.

D'autre part, si tu as besoin d'un ordre de passage par différentes Activity, je ne pense pas que une TabActivity soit la solution appropriée (que se passe-t'il si l'utilisateur clique directement sur le dernier onglet ? ). Il faudrait mieux utiliser des Activity qui s'enchainent

Lien vers le commentaire
Partager sur d’autres sites

L'instanciation d'une Activity doit être faite par le système, et non par ton propre code. Ce que tu fais donc dans le onTabChanged n'est pas correct.

D'autre part, si tu as besoin d'un ordre de passage par différentes Activity, je ne pense pas que une TabActivity soit la solution appropriée (que se passe-t'il si l'utilisateur clique directement sur le dernier onglet ? ). Il faudrait mieux utiliser des Activity qui s'enchainent

Je me doutais bien que ce n'est pas correct ... ^^ Mais cette Activity est instanciée au lancement de l'appli par la création de l'intent qui va générer le contenu de l'onglet non ? Donc comment accéder à cette instance?

Je suis encore un bleu en Java.... Merci de ta patience.

Cdlt,

Julien.

Lien vers le commentaire
Partager sur d’autres sites

Appeler une instance d'une Activity depuis une autre Activity n'est définitivement pas la façon de faire. Ce qu'il faut bien comprendre, c'est que c'est le système qui gère les Activity, et qui te dit quand tu vas pouvoir utiliser une Activity (via les appels des méthodes onCreate/onResume/onPause/...). Regarde du côté de la doc de référence Android, pour comprendre cette notion de cycle de vie des Activity.

Dans ton cas, si tu veux effectuer une action lorsque l'Activity de ton onglet est activiée, tu devrais pouvoir le faire en implémentant la méthode onResume de l'Activity de ton onglet, méthode que le système devrait appeler à ce moment là.

Lien vers le commentaire
Partager sur d’autres sites

Ok.

C'est dommage parce que j'ai un résultat qui s'affiche sur mon 3ème onglet, et les onglets me permettait d'aller modifier une variable sur un des deux onglets sans devoir repasser par les deux à chaque fois.

Sans les onglets, je dois repasser successivement par mes trois Activity si je veux changer quelque chose.

Ou alors je fais une Activity avec un bouton pour aller modifier chaque variable; et une 2eme Activity donnant le résultat; ce qui est tout aussi bien !

En fait, le onResume n'est pas appelé au changement d'onglet.

Merci quand même.

Cdlt,

Julien.

Lien vers le commentaire
Partager sur d’autres sites

Si je comprends bien, ce dont tu as besoin, c'est de partager des données entre tes onglets; certains de ces onglets modifient ces données, d'autres les affichent.

Il te faut donc avoir un objet que tu pourrais 'partager' entre tes Activity; dans Android, ce qui correspondrait, c'est la notion de Service.

Tu te crées une classe de type Service, qui propose des méthodes de mise à jour et de consultation de tes données; et tes Activities font appel à ce service pour manipuler/consulter les données.

C'est la façon de faire la plus propre et la plus en adéquation avec la 'philosophie' Android; mais pas la plus simple, j'en conviens...

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...