2012-10-22 10 views
7

Hey Leute Ich arbeite an einer Android App, wo ich eine Aktivitätsgruppe für jede Registerkarte implementieren möchte. Aber da die Aktivitätsgruppe veraltet ist, muss ich Fragmente verwenden. Ich habe die letzten Tage gegoogelt und recherchiert, aber ich verstehe es immer noch nicht. Die Grafik unten beschreibt, was ich tun möchte. Ich komme auch direkt von iOS und ich brauche ein Feedback über meine Theorien.Android Fragment vs. Aktivitätsgruppe

enter image description here

Wie Sie jedes Fragment besteht aus einem WebView Fragmente sehen. Wenn der Benutzer auf einen Link in diesem WebView-Fragment klickt, wird die Anfrage abgefangen und ein neues Fragment wird ersetzt, das wiederum ein WebView enthält und den Link lädt, auf den im vorherigen Fragment geklickt wurde. Zu einem Zeitpunkt entscheidet der Benutzer, zu dem ersten Fragment zurückzukehren und drückt den Zurück-Knopf.

Die Fragmente sollten in umgekehrter Reihenfolge vom Stapel springen, bis er den ersten wieder sieht. Im Idealfall sollte jedes Fragment seinen Instanzstatus speichern, so dass das WebView die Site nicht erneut laden muss, wenn der Benutzer es zurückgibt.

Ich bin auf ActionBar Sherlock gestoßen, die ein Beispiel zu Fragments Tabs bietet. Es gibt auch ein Beispiel für einen Fragmentstapel. Es wäre ideal, diese beiden Beispiele zu kombinieren, so dass jeder Reiter aus einem Fragmentstapel besteht.

aussehen Mein Code structs wie folgt aus:

Mein TabHost Fragment

public class MyActivity extends SherlockFragmentActivity { 
static TabHost mTabHost; 
static TabManager mTabManager; 

public static int THEME = R.style.Theme_Sherlock_Light; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    setTheme(THEME); //Used for theme switching in samples 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.fragment_tabs); 
    mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
    mTabHost.setup(); 
    mTabManager = new TabManager(this, mTabHost, R.id.myRealTabContent); 

    // adding some Fragment Tabs 
    mTabManager.addTab(mTabHost.newTabSpec(tabNames[i]).setIndicator(tabNames[i]), 
       FragmentStackSupport.CountingFragment.class, bundle); 


    if (savedInstanceState != null) { 
     mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); 
    } 
} 


@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("tab", mTabHost.getCurrentTabTag()); 
} 



// defining the Tab Manager 

Wie für jeden Tab das Fragment Stapel aussehen würde, sollten? Momentan habe ich eine Fragmentaktivität mit einem Fragment in jedem Tab. Aber ich erreiche nicht die Logik, die ich brauche.

Hier ist mein Code: (? Oder gibt es Beispiele auf dem Netz) My Fragment with WebView inside

Ich würde für ein Feedback und Hinweise freuen. Ich habe auch einige Bedenken bezüglich des Speichers - wenn der Benutzer klickt und klickt und klickt und der Speicher jedes Fragment im Stapel halten muss.

Prost.

+5

+1 für eine gut erklärte Frage. –

+0

Haben Sie jemals eine solide Lösung für dieses Problem gefunden? –

Antwort

1

Ich kann mir nicht viele gute Gründe vorstellen, jedes Mal, wenn der Benutzer auf einen Link klickt, ein neues Fragment zu erstellen. Gibt es einen Grund, dass du das versuchst? Wenn Sie einfach false von shalloverrideUrlLoading() zurückgeben, anstatt ein neues Fragment zu erstellen, lädt das WebView die neue Seite, und wenn Sie zurückgehen möchten, können Sie die Methoden canGoBack() und goBack() verwenden. Um das Zurückdrücken von Tasten zu behandeln, können Sie onKeyDown in Ihrer Aktivität überschreiben und Folgendes tun:

+0

Danke für Ihre Antwort. Ich stimme zu, dass es suboptimal ist, aber ich habe meine Gründe. Obwohl ich denke, dass ich Ihrem Rat folgen werde - es ist viel einfacher. Dennoch interessiert mich, wie man einen Fragmentstapel für jede Registerkarte implementieren würde. –

+0

Nun, da Sie gefragt haben, bin ich mir sicher, dass es keine großartige Idee ist, aber Sie könnten buchstäblich einen Stack (oder eine andere Datenstruktur) von Fragmenten für jeden Tab haben. Jedes Mal, wenn der Benutzer auf einen Link klickt, fügen Sie das Fragment dem Stack dieses Tabs hinzu (Sie möchten aus offensichtlichen Gründen keines Ihrer Fragmente dem Backstack der Anwendung hinzufügen). Dann fangen Sie den Zurück-Knopf und drücken Sie, um zu sehen, ob der Stapel des aktuell angezeigten Tabs nicht leer ist. Falls dies der Fall ist, klicken Sie auf den nächsten, um auf dem richtigen Tab angezeigt zu werden. – ajpolt

+0

Vielleicht mit einer separaten Aktivität pro Registerkarte, und jede Aktivität würde dann eigene Fragmente haben? – tbkn23