2012-06-26 14 views
10

Ich möchte eine Activity erstellen, die eine Art von Menü zeigt, die ein Benutzer durchlaufen kann. Durch Klicken auf ein Element wird ein neuer Bildschirm angezeigt, der dem Benutzer weitere Optionen bietet (Assistenten-ähnlich).Wechseln zwischen Fragmenten in einer einzigen Aktivität

Ich wollte dies mit Fragment s implementieren, aber es funktioniert nicht für mich.
Im Moment habe ich:

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:id="@+id/main_fragmentcontainer" > 

    <fragment 
     android:id="@+id/mainmenufragment" 
     android:name="com.myapp.MainMenuFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

    <fragment 
     android:id="@+id/secondmenufragment" 
     android:name="com.myapp.SecondMenuFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</LinearLayout> 

MainMenuFragment mit einem OnClickListener:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.mainmenu, container, false); 

    setupButton(view); 
    return view; 
} 

/* Button setup code omitted */ 

@Override 
public void onClick(View v) { 
    SherlockFragment secondRunMenuFragment = (SherlockFragment) getSherlockActivity().getSupportFragmentManager().findFragmentById(R.id.secondmenufragment); 
    FragmentTransaction transaction = getSherlockActivity().getSupportFragmentManager().beginTransaction(); 

    transaction.replace(android.R.id.content, secondMenuFragment); //also crashes with R.id.main_fragmentcontainer 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 

Nun, wenn ich die Taste drücken, stürzt die Anwendung mit diesem logcat:

06-27 01: 45: 26.309: E/AndroidRuntime (8747): java.lang.IllegalStateException: Die Container-ID des Fragments SecondMenuFragment {405e2a70 # 1 id = 0x7f060029} konnte nicht geändert werden: war 2131099689 jetzt 2131099687 06-27 01: 45: 26.309: E/AndroidRuntime (8747): bei android.support.v4.app.BackStackRecord.doAddOp (unbekannte Quelle)
06-27 01: 45: 26.309: E/AndroidRuntime (8747): bei android.support.v4.app.BackStackRecord.replace (Unbekannte Quelle)
06-27 01: 45: 26.309: E/AndroidRuntime (8747): bei android.support.v4.app.BackStackRecord.replace (Unbekannte Quelle)
06-27 01: 45: 26.309: E/AndroidRuntime (8747): unter com.myapp.MainMenuFragment $ MyButtonOnClickListener.onClick (MainMenuFragment.java:52)

Was mache ich falsch?

+0

[Es gibt eine ähnliche Frage hier] (http://stackoverflow.com/questions/9092048/swap-two-fragment- gleichzeitig) – adneal

+0

Wenn Sie versuchen, einen Assistenten zu erstellen, was ist der zweite '' für? – CommonsWare

+0

Ich habe diese Links tatsächlich gesehen, aber ich weiß nicht, wie man sie in meinem Fall anwendet. – nhaarman

Antwort

14

Ich persönlich hätte keine <fragment> Elemente.

Schritt # 1: Füllen Sie Ihr Aktivitätslayout mit einem <FrameLayout> für das variable Teil des Assistenten sowie Ihre verschiedenen Schaltflächen.

Schritt # 2: Führen Sie unter onCreate() der Aktivität eine FragmentTransaction aus, um die erste Assistentenseite in die FrameLayout zu laden.

Schritt # 3: Führen Sie bei dem "nächsten" Klick eine FragmentTransaction aus, um den Inhalt der FrameLayout durch die nächste Seite des Assistenten zu ersetzen.

Schritt 4: Fügen Sie die entsprechenden Smarts hinzu, um die Schaltflächen zu deaktivieren, wenn sie unbrauchbar sind (z. B. auf der ersten Seite des Assistenten).

Sie sollten auch darüber nachdenken, wie die Schaltfläche BACK in Verbindung mit einer Schaltfläche "Zurück" auf dem Bildschirm im Assistenten arbeiten sollte. Wenn Sie möchten, dass sie sich beide identisch verhalten, müssen Sie jede Transaktion zum Backstack hinzufügen und Inhalte vom Backstack entfernen, wenn Sie mit der Schaltfläche "Zurück" arbeiten.

Eines Tages, wenn mich niemand dazu bringt, werde ich versuchen, ein Beispiel für einen Assistenten zu erstellen, oder eine wiederverwendbare Komponente.

+0

Ich bin mir nicht sicher, ob ich dich richtig verstanden habe, aber ich habe es irgendwie funktioniert. Ich habe eine leere '' in meiner Aktivitätslayoutdatei abgelegt. Dann rief ich in 'onCreate()' der Aktivität 'FragmentTransaction.add()' auf, um '' MainMenuFragment() 'zu' R.id.main_fragmentcontainer' hinzuzufügen, die ID des ''. In 'MainMenuFragment'' onClick() 'erstelle ich ein' neues SecondMenuFragment() ', und füge es auf die gleiche Weise wieder zu' R.id.main_fragmentcontainer' hinzu. Das funktioniert zumindest. Ich bin besonders verwirrt in Schritt 1 _plus Ihre verschiedenen Tasten_. Was meinst du damit? Und könnte ich 'LinearLayout' nicht einfach benutzen? – nhaarman

+0

@Niek: "Was meinst du damit?" - In der Regel hat eine Wizard-Oberfläche die Schaltflächen "Zurück" (oder "Zurück") und "Weiter". Es gibt keinen Grund, diese in die Fragmente zu stecken, da sie während aller Zaubererschritte gleich bleiben, also würde ich annehmen, dass du sie direkt in die Aktivität bringst. "Und konnte ich LinearLayout nicht einfach benutzen?" -- Wofür? – CommonsWare

+0

Oh diese Tasten, ich dachte du meinst meine Menü-Tasten. Und Sie haben in Schritt 1 ein FrameLayout vorgeschlagen, aber das hängt mit der Überlagerung der Schaltflächen "next" und "previous" zusammen. Danke für Ihre Hilfe! – nhaarman

12

Ich schaffe diese Haupt Layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    tools:context="com.example.fragmentsexample.MainActivity" > 

    <FrameLayout 
     android:id="@+id/contentFragment" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" /> 

</LinearLayout> 

Und ich nachgefüllt im FrameActivity mit:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    Fragment fragment = new Dashboard(); 
    FragmentManager fm = getSupportFragmentManager(); 
    FragmentTransaction transaction = fm.beginTransaction(); 
    transaction.replace(R.id.contentFragment, fragment); 
    transaction.commit(); 
    ... 
} 

Und ich repleace auf onClick Methode mit dem gleichen Code, cahnging Fragment (Dashboard für Veranstaltungen) :

0

Eine weitere Option ist die Verwendung der Android-WizardPager von Roman Nuri k.

Key Features:

  • Branching, oder die Fähigkeit, für Assistenten Schritte später die Verfügbarkeit beeinflussen von
  • Schritte
  • dem Benutzer ermöglicht, bevor sie sich
  • ermöglicht dem Benutzer, Freiform-Navigation zwischen den Assistenten, um zu überprüfen
  • Unterstützung für erforderliche und optionale Schritte
  • Unterstützung für Schrittklassen (technisch ist jeder Schritt eine Instanz von Java c lass, so können Sie mehrere Instanzen innerhalb des Assistenten haben)

Mehr Infos here.

Verwandte Themen