43 votes

Android - Basculer entre les onglets depuis une activité dans un onglet

Actuellement, j'ai un TabHost mis en œuvre avec 3 onglets contenant chacun une activité distincte. Ma question est la suivante: comment basculer entre les onglets depuis l'une des activités situées dans l'hôte d'onglets. J'ai regardé partout et je n'ai pas réussi à trouver une réponse réelle à ce problème.

94voto

crv Points 1813

Après un long moment de se battre avec ce problème que j'ai été en mesure de trouver une solution à la commutation des onglets lors de l'utilisation de l'activité en fonction des onglets.

Dans le parent de la classe d'activité où la tabhost est créé j'ai mis en place une méthode comme celle ci-dessous:

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

À l'intérieur de l'onglet que je voudrais être en mesure de passer à l'interne à 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 voulez un bon exemple de ce code, vous pouvez prendre un coup d'oeil à mon MintTrack projet ici et ici.

Comme une note de côté, s'il vous plaît être très prudent au moment de décider de l'utilisation de la vue ou de l'activité en fonction TabHost.

Activity basé sur les onglets sont grands parce qu'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é dans un. Cela étant dit, certaines des choses que vous penseriez serait facile de devenir compliqué avec l'activité de base d'onglets. Il est difficile de transmettre des informations entre les onglets sans créer de surcharge. Activity basé sur les onglets également utiliser plus de mémoire/CPU le temps comme ils ont la surcharge de l' Activity autour de chacun d'eux. Veuillez tenir compte de cela et beaucoup plus de compromis avant de plonger dans l'aide d'un Activity base TabHost. Maintenant, je sais que je serais personnellement aller avec une vue basée TabHost si je n'ai jamais utilisé de nouveau.

10voto

Anders Petersson Points 156

J'ai rencontré le même problème. Alors qu'une seule activité pour tous les onglets serait mieux, parfois en prenant le chemin le plus facile est le choix rationnel.

Pour éviter de créer un nouvel onglet activité lors d'un onglet veut passer à un autre onglet, j'ai mis cela dans mon AndroidManifest.xml:

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

Envoyer une intention avec l'onglet que vous voulez:

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 savez assez pour vous les montrer.

6voto

Sertalp Bilal Points 197

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 mon onglet d'activité.

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

Cela a fonctionné pour moi.

5voto

CommonsWare Points 402670

Étape #1: Remplacer les onglets de rétention d'activités avec des onglets-holding-vues à l'aide d'une meilleure forme d' setContent() sur TabSpec

Étape #2: Appelez - setCurrentTab() sur votre TabHost de votre unique, Activity

J'ai pas encore vu tous les avantages d'avoir un Activity être le contenu d'un onglet plutôt qu'un simple View. Avoir un Activity que le contenu de l'onglet déchets de temps PROCESSEUR et de la mémoire (et, par conséquent, la vie de la batterie) et rend les choses comme vous essayez de le faire beaucoup plus difficile.

3voto

bkurzius Points 1167

J'ai eu un problème un peu différent et j'ai pensé ajouter cela pour quelqu'un d'autre face à une situation similaire. J'ai une activité basée sur des onglets de l'application et de l'un de l'onglet activités en lance une autre activité qui n'est pas contrôlée par le tabHost. J'avais besoin d'avoir un bouton sur cette activité finish() (c'est à dire: retournez à l'Onglet principal) et passer à un autre onglet en même temps.

J'ai décidé de la traiter avec un BroadcastReceiver. Dans la classe qui définit la 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);
   } 
}

..ensuite défini les vars:

ChangeTabReceiver changeTabReceiver;
IntentFilter changeTabFilter;

..alors ajouté à onCreate():

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

Enfin, dans la nouvelle activité quand vous voulez fermer que de l'activité et de basculer les onglets, faites ceci:

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

Bien sûr, vous pourriez faire une méthode pour passer les différents onglets en passant par l'onglet index -- mais dans mon cas, ce comportement se produit uniquement dans une activité, alors j'ai décidé de faire simple...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X