Android – Changer d’onglet depuis une activité dans un onglet

Actuellement, j’ai un TabHost implémenté avec 3 tabs contenant chacun une activité distincte. Ma question est de savoir comment basculer entre les tabs d’une des activités situées dans l’hôte de l’onglet. J’ai regardé partout et je n’ai pas réussi à trouver une vraie réponse à ce problème.

Après une longue période de lutte contre ce problème, j’ai pu trouver une solution pour changer d’onglet lors de l’utilisation d’tabs basés sur l’activité.

Dans la classe d’activité parent où le tabhost est créé, j’ai implémenté une méthode comme celle ci-dessous:

public void switchTab(int tab){ tabHost.setCurrentTab(tab); } 

À l’intérieur de l’onglet que je voudrais pouvoir basculer en interne vers un autre onglet, j’ai créé la méthode ci-dessous:

 public void switchTabInActivity(int indexTabToSwitchTo){ MintTrack parentActivity; parentActivity = (MintTrack) this.getParent(); parentActivity.switchTab(indexTabToSwitchTo); } 

Si vous souhaitez un bon exemple de ce code, vous pouvez consulter mon projet MintTrack ici et ici .

En guise de remarque, veuillez faire très attention lorsque vous décidez d’utiliser TabHost basé sur les vues ou les activités.

Activity tabs basés sur les Activity sont parfaits car ils peuvent être séparés dans leur propre fichier XML. Les activités peuvent également être organisées dans leur propre fichier Java au lieu d’être encombrées par un seul. Cela étant dit, certaines des choses que vous pensez faciles seraient compliquées avec des tabs basés sur les activités. Il est difficile de transmettre des informations entre les tabs sans créer de surcharge. Activity tabs basés sur les Activity utilisent également plus de temps de mémoire et de temps processeur car ils ont la surcharge de l’ Activity autour de chacun d’eux. Veuillez considérer ceci et les nombreux autres compromis avant de plonger dans l’utilisation d’un TabHost basé sur les TabHost . Je sais maintenant que j’irais personnellement avec un TabHost basé sur les TabHost si je les utilisais à nouveau.

J’ai rencontré le même problème. Bien qu’une seule activité pour tous les tabs soit préférable, il est parfois rationnel de prendre la solution de facilité.

Pour éviter de créer une nouvelle activité d’onglet lorsqu’un onglet souhaite changer d’onglet, je le mets dans mon fichier AndroidManifest.xml:

  

Envoyez une intention avec l’onglet souhaité:

 class OneTabContentActivity { void switchTab() { final Intent intent = new Intent(mContext, MyTabsActivity.class); intent.setAction("Switch to tab 1, please"); mContext.startActivity(intent); } class MyTabsActivity { @Override protected void onNewIntent (Intent intent) { super.onNewIntent(intent); getTabHost().setCurrentTab(1); } } 

Cette solution a des inconvénients mais je ne suis pas clair sur les détails. Quelqu’un d’autre pourrait en savoir assez pour les signaler.

Premièrement, je mets une méthode dans ma classe principale, qui étend TabActivity appelons-la “MainActivity”

 public TabHost getMyTabHost() { return tabHost; } 

Ensuite, j’ajoute ma classe d’activité tabulation;

 MainActivity ta = (MainActivity) this.getParent(); TabHost th = ta.getMyTabHost(); th.setCurrentTab(0); 

Cela a fonctionné pour moi.

Etape n ° 1: Remplacez les activités de maintien des tabulations par des vues de maintien des tabulations en utilisant une meilleure forme de setContent() sur TabSpec

Étape # 2: Appelez setCurrentTab() sur votre TabHost depuis votre Activity unique

Je n’ai pas encore vu d’avantage à ce qu’une Activity soit le contenu d’un onglet plutôt qu’une simple View . Avoir une Activity comme contenu de l’onglet gaspille le temps et la mémoire du processeur (et, par conséquent, la durée de vie de la batterie) et rend les choses plus difficiles.

J’avais un problème légèrement différent et pensais que j’appendais ceci pour quiconque serait confronté à une situation similaire. J’ai une application à tabs basée sur l’activité et l’une des activités de l’onglet lance une autre activité qui n’est pas contrôlée par le tabHost. Je devais avoir un bouton sur cette activité finish () (c.-à-d. Retourner à l’affichage principal) et passer à un autre onglet en même temps.

J’ai décidé de le gérer avec un BroadcastReceiver. Dans la classe qui configure le TabHost, j’ai ajouté cette classe:

 class ChangeTabReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "ChangeTabReceiver: received"); TabHost tabHost = getTabHost(); tabHost.setCurrentTab(1); } } 

..then défini les vars:

 ChangeTabReceiver changeTabReceiver; IntentFilter changeTabFilter; 

..then ajouté à onCreate ():

 changeTabReceiver = new ChangeTabReceiver(); changeTabFilter = new IntentFilter(myApplication.CHANGE_TAB); registerReceiver(changeTabReceiver, changeTabFilter); 

Enfin, dans la nouvelle activité, lorsque vous souhaitez fermer cette activité et changer d’onglet, procédez comme suit:

 Intent intent = new Intent(myApplication.CHANGE_TAB); this.sendBroadcast(intent); this.finish(); 

Bien sûr, vous pourriez faire une méthode pour passer à différents tabs en passant l’index de tabulation – mais dans mon cas, ce comportement ne se produit que dans une activité, j’ai donc décidé de le garder simple …

 public void switchTab(int index){ MintTrack ParentActivity; ParentActivity = (MintTrack) this.getParent(); ParentActivity.getTabHost().setCurrentTab(index); } 

Je viens de mettre un public static TabHost tabHost; dans mon TabActivity .

Puis, depuis n’importe quel autre onglet, je peux faire un MyTabActivity.tabHost.setCurrentTab(tabNumber);

Fonctionne bien pour moi (mais j’aurais aimé utiliser Fragments depuis le début .. Je suivais juste le didacticiel Tab dans la documentation Android et à partir de là)