43 Stimmen

Android - Umschalten von Tabs aus einer Aktivität innerhalb eines Tabs

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.

93voto

crv Punkte 2984

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.

10voto

Anders Petersson Punkte 349

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.

6voto

Sertalp B. Cay Punkte 552

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.

5voto

CommonsWare Punkte 950864

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.

3voto

bkurzius Punkte 4008

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...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X