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.
Réponses
Trop de publicités?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.
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.
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.
É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.
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...