Android-changer les onglets à partir d'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'hôte de l'onglet. J'ai regardé partout et j'ai échoué à trouver une vraie réponse à ce problème.
7 réponses
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'onglets 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 passer en 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 jeter un oeil à mon projet MintTrack ici et ici.
En guise de remarque, soyez très prudent lorsque vous décidez d'utiliser TabHost en fonction de la vue ou de l'activité.
Activity
les onglets basés sont excellents car ils peuvent être séparés en leur propre fichier XML. Les activités peuvent également être organisées en propre fichier Java au lieu d'être encombré en un seul. Cela étant dit, certaines des choses que vous penseriez être faciles deviennent compliquées avec des onglets basés sur l'activité. Il est difficile de transmettre des informations entre les onglets sans créer de frais généraux. Les onglets basés sur Activity
utilisent également plus de temps mémoire / CPU car ils ont la surcharge du Activity
autour de chacun d'eux. Veuillez considérer ceci et les nombreux autres compromis avant de 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 utilisais à nouveau.
J'ai rencontré le même problème. Alors qu'une seule activité pour tous les onglets serait mieux, parfois prendre la solution facile est le choix rationnel.
Pour éviter de créer une nouvelle activité d'onglet lorsqu'un onglet veut passer à un autre onglet, je l'ai mis 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 savoir assez pour les signaler.
Tout d'abord, je mets une méthode à 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.
Étape #1: Remplacer les onglets de rétention d'activités avec des onglets-holding-vues à l'aide d'une meilleure forme de setContent()
sur TabSpec
Étape # 2: appelez setCurrentTab()
sur votre TabHost
à partir de votre 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
comme contenu de l'onglet gaspille du temps CPU et de la mémoire (et, par conséquent, la vie de la batterie) et rend les choses comme vous essayez de faire beaucoup plus difficile.
J'ai eu un problème légèrement différent et j'ai pensé que j'ajouterais ceci pour quelqu'un d'autre faisant face à 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é finish() (c'est à dire: retournez à l'Onglet 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);
}
}
..puis 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 les onglets, 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 comportement ne se produit que dans une activité, alors j'ai décidé de rester 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 à partir de n'importe quel autre onglet, je peux faire un MyTabActivity.tabHost.setCurrentTab(tabNumber);
Fonctionne bien pour moi (mais j'aurais aimé utiliser des Fragments depuis le début.. Je suivais juste le tutoriel de L'onglet dans la documentation Android et je travaillais à partir de là)