2012-10-23 15 views
7

Ich suche nach Best Practice der Tab-Navigation mit Sherlock Actionbar. Was ist die richtige Methode zum Ändern der Fragmente und Hinzufügen von Fragmenten zum Backstack und Löschen des Backstacks, wenn ein anderer Tab ausgewählt wird.Best Practice für die Tab-Navigation?

Gibt es gute Beispiele oder Open-Source-Projekte, die zeigen, wie man es richtig macht?

Antwort

6

Ich würde ABS nicht direkt verwenden, um das zu tun. Sie werden in Schwierigkeiten geraten, sobald Ihre Tabs Fragmentwechsel erfordern usw. Ich denke, der richtige Ansatz dafür ist die Verwendung von ViewPagerIndicator, der mit ABS kompatibel ist. Als Bonus erhalten Sie auch den Swipe rechts-links zwischen den Tabs. Sie benötigen das compat-Paket (wie für ABS), Beispielverwendung finden Sie in der samples folder.

+0

Aber gibt es eine Möglichkeit, Fragmente mit einem View Pager zum Backstack hinzuzufügen? Im Moment verwalte ich meine eigenen Fragmente Backstack für jeden Tab. – meh

+0

Ich hatte keinen solchen Fall. Ich schätze, es hängt stark davon ab, wie sich der Backstack verhalten soll. Sie können sich für das Ereignis der Änderungsseite registrieren und den Backstack löschen, wenn Sie den Verlauf nur innerhalb der Registerkarten speichern möchten. Wenn Sie möchten, dass der Zurück-Button Sie auch in andere Tabs zurückbringt, wird es definitiv komplizierter. Dies sollte jedoch nicht so einfach sein, wenn Sie den nativen Tab-Ansatz verwenden. – stoilkov

+0

Können Sie Ihrer Antwort bitte ein grundlegendes Beispiel für die Implementierung von ViewPagerIndicator hinzufügen? und welche Pakete muss ich verwenden, um auf älteren Android-Versionen wie 2.2 zu arbeiten. – meh

6

Wie Edgar erwähnt die android navigation guide ist ein guter Ort zu starten. Aber lassen Sie mich einige Kommentare hinzufügen, wie Tabs mit Android arbeiten soll.

Die neuen acitonbar-Tabs sollten genauso implementiert werden wie in der Google Play App. Das bedeutet, sobald Sie einige Details eines Inhalts innerhalb eines Tabs sehen möchten, gelangen Sie zu einer neuen Ansicht/einem neuen Fragment/einer neuen Aktivität und die Tabs verschwinden.

So sollten die Registerkarten für Android nicht ständig sichtbar sein, sondern nur in der oberen Hierarchie. Wenn Sie die Navigation für den Benutzer vereinfachen möchten, implementieren Sie die Schaltfläche "Hoch", damit der Benutzer schnell zur obersten Hierarchie zurückkehren kann, in der die Registerkarten angezeigt werden.

Tutorial und Proben

Mein persönliches Lieblingsbeispiel und Tutorial sind die tabs tutorial unter dem ActionBar Tutorial auf Googles Webseite.

Beispiele für Tab-Navigation finden Sie auch im Beispielprojekt, das mit dem Android-SDK geliefert wird. Gehe zu: android-sdk\extras\android\support\samples\Support4Demos\src\com\example\android\supportv4\app Und suchen Sie nach: FragmentTabs.java oder FragmentTabsPager.java.

Wenn Sie ActionBarSherlock verwenden möchten, können Sie auch den Ordner download ActionBarSherlock im Verzeichnis/samples ansehen. Dort haben Sie Tab-Demos in TabNavigation.java und TabNavigationCollapsed.java. Obwohl ich denke, du solltest das Actionbar Tutorial eine Chance geben.

Tabs mit Rücken Stapel

lässt sich auch sagen, dass Sie eine Tab-Leiste haben wollen, die ganze Zeit sichtbar ist (obwohl es nicht wird empfohlen). Dann müssen Sie einen benutzerdefinierten Backstack für jede Registerkarte erstellen. Sie können here für ein Beispiel suchen, wie Sie das implementieren.

Karten und Tabs

Werfen Sie einen Blick auf alle Googles Apps, die Karte verwenden. Verwenden Sie Google Overflow-Aktionsleisten, um mit ihnen zu navigieren. Also sollten wir als Entwickler aber mit Google Mapsv2 für Android Tabs mit Karten viel einfacher geworden sein, wenn jemand dies wünschen sollte.

+0

hat mir wirklich geholfen! Danke! –

1

Ich habe ActionbarSherlock mit Fragmenten und Tabs viele Male getan und es funktioniert wunderbar.

Sie benötigen einen TabListener:

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 

import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.ActionBar.Tab; 
import com.android.wifilogger.R; 

public class WifiTabListener implements ActionBar.TabListener { 
     public Fragment fragment; 
     public MainTabActivity act; 

     public WifiTabListener(Fragment fragment, MainTabActivity act) { 
     this.fragment = fragment; 
     this.act = act; 
     } 


     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      ft.replace(R.id.root, fragment); 
     } 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      ft.remove(fragment); 
     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     } 
} 

und Ihre TabActivity Einrichtung:

public class MainTabActivity extends SherlockFragmentActivity { 

public ActionBar actionBar; 
private ActionBar.Tab listTab; 
public MenuItem refreshItem; 
private SherlockFragment listFragment; 
private SherlockFragment mapFragment; 



@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // getActionBar().setDisplayHomeAsUpEnabled(true); 


    actionBar = getSupportActionBar(); 

    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

    setContentView(R.layout.main); 

    ActionBar.Tab settingsTab = actionBar.newTab().setText("Settings") 
      .setTag("settings"); 
    listTab = actionBar.newTab().setText("Wifi List") 
      .setTag("list"); 
    ActionBar.Tab mapTab = actionBar.newTab().setText("Map").setTag("map"); 

    SherlockFragment settingsFragment = new SettingsFragment(); 
    listFragment = new WifiListFragment(); 
    mapFragment = new WifiMapFragment(); 

    settingsTab.setTabListener(new WifiTabListener(settingsFragment, this)); 
    listTab.setTabListener(new WifiTabListener(listFragment, this)); 
    mapTab.setTabListener(new WifiTabListener(mapFragment, this)); 

    actionBar.addTab(listTab,false); 
    actionBar.addTab(mapTab,false); 
    actionBar.addTab(settingsTab,false); 
    actionBar.selectTab(listTab); 

} 

Wo Sie müssen SettingsFragment, MapFragment und ListFragment zu Ihrer eigenen Fragmente ändern. Sie können auch ein DialogFragment in einem dieser Tabfragmente mit usng setTargetFragment hinzufügen, aber das ist nicht Ihre Frage, denke ich.