Derzeit habe ich einen TabHost mit 3 Registerkarten implementiert, die jeweils eine separate Aktivität enthalten. Meine Frage ist, wie ich zwischen Registerkarten aus einer der Aktivitäten, die innerhalb der Registerkarte Host befindet wechseln. Ich habe überall nachgeschaut und konnte keine wirkliche Antwort auf dieses Problem finden.
Antworten
Zu viele Anzeigen?Nach langem Kampf mit diesem Problem habe ich eine Lösung für das Umschalten von Registerkarten bei Verwendung von aktivitätsbasierten Registerkarten gefunden.
In der übergeordneten Aktivitätsklasse, in der der Tabhost erstellt wird, habe ich eine Methode wie die folgende implementiert:
public void switchTab(int tab){
tabHost.setCurrentTab(tab);
}
Innerhalb der Registerkarte, die ich intern zu einer anderen Registerkarte umschalten möchte, habe ich die folgende Methode erstellt:
public void switchTabInActivity(int indexTabToSwitchTo){
MintTrack parentActivity;
parentActivity = (MintTrack) this.getParent();
parentActivity.switchTab(indexTabToSwitchTo);
}
Wenn Sie ein gutes Beispiel für diesen Code haben möchten, können Sie sich mein MintTrack-Projekt ansehen aquí y aquí .
Als Randbemerkung: Bitte seien Sie sehr vorsichtig, wenn Sie sich entscheiden, ob Sie TabHost auf Basis von Ansichten oder Aktivitäten verwenden.
Activity
basierte Registerkarten sind großartig, weil sie in eine eigene XML-Datei aufgeteilt werden können. Aktivitäten können auch in einer eigenen Java-Datei organisiert werden, anstatt in einer einzigen Datei überladen zu sein. Das heißt, dass einige der Dinge, von denen man denken würde, dass sie einfach sind, mit aktivitätsbasierten Registerkarten kompliziert werden. Es ist schwierig, Informationen zwischen Registerkarten weiterzugeben, ohne Overhead zu erzeugen. Activity
basierten Tabs verbrauchen auch mehr Speicher/CPU-Zeit, da sie den Overhead der Activity
um jeden von ihnen herum. Bitte bedenken Sie dies und die vielen weiteren Nachteile, bevor Sie sich auf die Verwendung eines Activity
basiert TabHost
. Ich weiß jetzt, dass ich mich persönlich für eine Ansicht entscheiden würde, die auf TabHost
wenn ich sie jemals wieder benutzen würde.
Ich bin auf das gleiche Problem gestoßen. Eine einzige Aktivität für alle Registerkarten wäre zwar besser, aber manchmal ist es vernünftig, den einfachen Weg zu wählen.
Um zu vermeiden, dass eine neue Registerkartenaktivität erstellt wird, wenn eine Registerkarte zu einer anderen Registerkarte wechseln möchte, habe ich dies in meine AndroidManifest.xml aufgenommen:
<activity android:name=".MyTabsActivity"
android:label="Tabs!"
android:launchMode="singleTask">
Senden Sie eine Absichtserklärung mit der gewünschten Registerkarte:
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);
}
}
Diese Lösung hat Nachteile, aber ich bin mir über die Einzelheiten nicht im Klaren. Vielleicht weiß jemand anderes genug, um sie aufzuzeigen.
Zuerst setze ich eine Methode in meine Hauptklasse, die TabActivity erweitert, nennen wir sie "MainActivity".
public TabHost getMyTabHost() { return tabHost; }
Dann füge ich meine Tab-Aktivitätsklasse hinzu;
MainActivity ta = (MainActivity) this.getParent();
TabHost th = ta.getMyTabHost();
th.setCurrentTab(0);
Bei mir hat es funktioniert.
Schritt Nr. 1: Ersetzen Sie die "Tabs-holding-activities" durch "Tabs-holding-views", indem Sie eine bessere Form von setContent()
en TabSpec
Schritt #2: Anrufen setCurrentTab()
zu Ihrem TabHost
aus Ihrem Einzelzimmer Activity
Ich habe noch keine Vorteile für die Verwendung einer Activity
der Inhalt einer Registerkarte sein und nicht eine einfache View
. Mit einer Activity
da der Inhalt der Registerkarte CPU-Zeit und Speicherplatz (und damit Batterielebensdauer) verschwendet und Dinge, die Sie zu tun versuchen, viel schwieriger macht.
Ich hatte ein etwas anderes Problem und dachte, ich würde dies für alle anderen mit einer ähnlichen Situation hinzufügen. Ich habe eine aktivitätsbasierte Anwendung mit Registerkarten und eine der Registerkarten-Aktivitäten startet eine andere Aktivität, die nicht durch den tabHost gesteuert wird. Ich brauchte eine Schaltfläche auf dieser Aktivität finish() (dh: zurück zu den wichtigsten Tab-Ansicht) und wechseln Sie zu einer anderen Registerkarte zur gleichen Zeit haben.
Ich habe beschlossen, dies mit einem BroadcastReceiver zu behandeln. In der Klasse, die den TabHost einrichtet, habe ich diese Klasse hinzugefügt:
class ChangeTabReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "ChangeTabReceiver: received");
TabHost tabHost = getTabHost();
tabHost.setCurrentTab(1);
}
}
..dann die Variablen definiert:
ChangeTabReceiver changeTabReceiver;
IntentFilter changeTabFilter;
dann zu onCreate() hinzugefügt:
changeTabReceiver = new ChangeTabReceiver();
changeTabFilter = new IntentFilter(myApplication.CHANGE_TAB);
registerReceiver(changeTabReceiver, changeTabFilter);
Wenn Sie die neue Aktivität schließen und die Registerkarten wechseln möchten, gehen Sie wie folgt vor:
Intent intent = new Intent(myApplication.CHANGE_TAB);
this.sendBroadcast(intent);
this.finish();
Natürlich könnte man eine Methode zum Umschalten auf verschiedene Registerkarten machen, indem man den Registerindex übergibt - aber in meinem Fall tritt dieses Verhalten nur in einer Aktivität auf, also habe ich beschlossen, es einfach zu halten...
- See previous answers
- Weitere Antworten anzeigen