2013-02-11 2 views
3

Je souhaite basculer entre 2 fragments situés dans 1 activité, de sorte que l'autre fragment remplace toujours le fragment actuel. Je ne peux pas trouver mon erreur si :(Commutation par programmation entre les fragments

Ma principale activité:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_layout); 

    Fragment fragment = new FirstFragment(); 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.add(R.id.container, fragment, "first"); 
    transaction.addToBackStack(null); 
    transaction.commit(); 
} 

Mon activity_layout:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/container" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context=".MainActivity" 
tools:ignore="MergeRootFrame" /> 

maintenant, à un moment donné dans la logique de la FirstFragment (qui fonctionne très bien), la méthode suivante est appelée

private void startSecondFragment(){ 

    Fragment fragment = new SecondFragment(); 
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
    transaction.add(R.id.container, fragment, "second"); 
    transaction.addToBackStack(null); 
    transaction.commit(); 

} 

Cette fonction se termine sans erreur, mais juste après l'exception suivante se jette:

02-11 13:40:30.533: E/AndroidRuntime(907): java.lang.IllegalArgumentException: No view found for id 0x7f070000 (com.myexample.app:id/container) for fragment SecondFragment{412c9388 #0 id=0x7f070000 second} 

Maintenant, il semble que ce ne est pas en mesure de trouver l'identifiant « conteneur » à ce stade (le premier fragment a remplacé ce conteneur). Comment puis-je vraiment remplacer le premier fragment?

Répondre

3

Il devrait ressembler à ceci:

private void startSecondFragment(){ 

    Fragment fragment = new SecondFragment(); 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.add(R.id.container, fragment, "second"); 
    transaction.addToBackStack(null); 
    transaction.commit(); 

} 

Vous ne voulez pas obtenir FragmentManager enfant, parce que vos fragments sont dans votre activité, vous devez donc le même fragmentManager.