web-dev-qa-db-fra.com

Android - Changer d'onglet depuis une activité dans un onglet

Actuellement, j'ai un TabHost implémenté avec 3 onglets contenant chacun une activité distincte. Ma question est de savoir comment basculer entre les onglets à partir de l'une des activités situées à l'intérieur de l'onglet Hôte. J'ai cherché partout et je n'ai pas réussi à trouver une vraie réponse à ce problème.

43
crv

Après avoir longtemps lutté contre ce problème, j'ai pu trouver une solution pour changer d'onglet lors de l'utilisation des onglets basés sur l'activité.

Dans la classe d'activité parent où l'hôte de tabulation 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 j'aimerais 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 jeter un œil à mon projet MintTrack ici et ici .

En remarque, soyez très prudent lorsque vous décidez d'utiliser TabHost basé sur une vue ou une activité.

Les onglets basés sur Activity sont excellents car ils peuvent être séparés en leur propre fichier XML. Les activités peuvent également être organisées dans leur propre fichier Java au lieu d'être encombré en un seul. Cela étant dit, certaines des choses que vous pensez qu'il serait facile de se compliquer avec les onglets basés sur les activités. Il est difficile de passer les informations entre les onglets sans créer de surcharge. Les onglets basés sur Activity utilisent également plus de temps de mémoire/CPU car ils ont la surcharge de Activity autour de chacun d'eux. Veuillez considérer ceci et les nombreux autres compromis avant plonger dans l'utilisation d'un Activity basé sur TabHost. Je sais maintenant que j'irais personnellement avec une vue basée sur TabHost si je les réutilisais.

94
crv

J'ai rencontré le même problème. Bien qu'une seule activité pour tous les onglets soit préférable, il est parfois judicieux de choisir la solution de facilité.

Pour éviter de créer une nouvelle activité d'onglet lorsqu'un onglet souhaite passer à un autre onglet, je le mets dans mon AndroidManifest.xml:

<activity Android:name=".MyTabsActivity"
        Android:label="Tabs!"
        Android:launchMode="singleTask">

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 présente des inconvénients mais je ne suis pas clair sur les détails. Quelqu'un d'autre pourrait en savoir assez pour les signaler.

10
Anders Petersson

Tout d'abord, j'ai défini une méthode pour ma classe principale, qui étend TabActivity appelons-la "MainActivity"

public TabHost getMyTabHost() { return tabHost; }

Ensuite, j'ajoute ma classe d'activité d'onglet;

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

Ça a marché pour moi.

6
Sertalp Bilal

Étape # 1: remplacez tabs-holding-activities par tabs-holding-views en utilisant une meilleure forme de setContent() sur TabSpec

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

Je n'ai encore vu aucun avantage à avoir un Activity le contenu d'un onglet plutôt qu'un simple View. Avoir un Activity comme contenu de l'onglet gaspille du temps CPU et de la mémoire (et, par conséquent, l'autonomie de la batterie) et rend les choses comme si vous essayiez de faire beaucoup plus difficile.

5
CommonsWare

J'ai eu un problème légèrement différent et j'ai pensé l'ajouter à toute personne confrontée à une situation similaire. J'ai une application à onglets basée sur les activités et l'une des activités de l'onglet lance une autre activité qui n'est pas contrôlée par tabHost. J'avais besoin d'avoir un bouton sur cette activité () (c'est-à-dire: revenir à la vue principale de l'onglet) 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 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 a défini les vars:

ChangeTabReceiver changeTabReceiver;
IntentFilter changeTabFilter;

.. puis 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 pouvez créer une méthode pour passer à différents onglets en passant l'index des onglets - mais dans mon cas, ce problème ne se produit que dans une seule activité, j'ai donc décidé de rester simple ...

3
bkurzius
public void switchTab(int index){
   MintTrack ParentActivity;
   ParentActivity = (MintTrack) this.getParent();
   ParentActivity.getTabHost().setCurrentTab(index);
}
2
Jimmy Rollins

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

Ensuite, à partir de tout autre onglet, je peux faire une MyTabActivity.tabHost.setCurrentTab(tabNumber);

Fonctionne très bien pour moi (mais j'aurais aimé avoir utilisé des fragments depuis le début .. Je suivais juste le tutoriel Tab dans la Android et je travaillais à partir de là)

2
Tim