2013-01-16 7 views
35

Je tente de charger un nouveau fragment quand une méthode est appelée. Cette méthode crée un nouveau fragment et "remplace" l'autre fragment:Android: Fragments backStack

private void showTestFragment(Fragment oldFragment, boolean addBackStack, BaseAdapter adapter, int position) { 
    Cursor cursor = (Cursor)adapter.getItem(position); 
    if(cursor != null){ 

     int idx = cursor.getColumnIndexOrThrow(Episode._ID); 
     long rowId = cursor.getLong(idx); 

     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     if(oldFragment != null){ 
      Log.i(TAG, "Removing the old fragment"); 
      fragmentTransaction.remove(oldFragment); 
     } 

     TestFragment testFragment = new TestFragment(); 
     testFragment.setId(rowId); 

     fragmentTransaction.add(android.R.id.content, testFragment); 

     if(addBackStack){ 
      Log.i(TAG, "Added to the backstack"); 
      fragmentTransaction.addToBackStack(TAG); 
     } 

     fragmentTransaction.commit(); 
     Fragment f = getFragmentManager() 
       .findFragmentById(R.id.index); 
     Log.i(TAG, "after commit, frag is "+ f); 
    } 
} 

Cela fonctionne bien, jusqu'à ce que je revienne en arrière. Le dernier fragment, devrait être enlevé quand je reviens. Avant que je vais mettre en œuvre des méthodes sur les activités

public void onBackPressed(){} 

pour enlever le dernier fragment, je veux savoir si je manipuler le changement de fragment. On dirait que je manque quelque chose ici ..

+0

double possible de [Comment mettre en œuvre onBackPressed() en fragments?] (Http://stackoverflow.com/questions/5448653/how-to-implement-onbackpressed-in-fragments) –

Répondre

78

Si vous voulez vraiment remplacer le fragment puis utilisez le remplacer() Methode au lieu de faire un supprimer() et un add().

FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(..............); 
    fragmentTransaction.addToBackStack(null); 
    fragmentTransaction.commit(); 

Ne pas oublier de faire la addToBackStack (null) de sorte que votre état précédent sera ajouté à la backstack vous permettant de revenir en arrière avec le bouton de retour.

Voir aussi https://developer.android.com/reference/android/app/FragmentTransaction.html#replace(int, android.app.Fragment, java.lang.String).

Une autre bonne source est http://developer.android.com/guide/components/fragments.html (recherche de la fonction replace()).

+2

remplacer() = = remove (thisFragment) .add (anotherFragment). Replace est égal aux deux méthodes dans cet ordre. – Nepster

+0

@Nepster, c'est vrai, mais pas toujours pratique. FWIW, La différence est que Replace supprime TOUT fragment (s) dans le conteneur; n'a pas besoin de connaître 'thisFragment'. Un scénario où cela importe est si le fragment A relie au fragment B1 qui est remplacé par le fragment B2. ALORS si vous voulez "Retour" bouton pour revenir à Fragment A (au lieu de B1), nous devons coder manuellement, parce qu'Android sera de retour [incorrectement à mon humble avis] "supprimer B1, ajouter A" - le contraire du lien d'origine de A à B1. B2 se cache dans viewbehind. Notre code doit savoir que B2 est le fragment actuel, pas B1. Parfois, c'est gênant. – ToolmakerSteve

4

Il suffit de retirer la première et l'appel super.onBackPressed

public void onBackPressed(){ 

    // here remove code for your last fragment 
    super.onBackPressed(); 

} 
0
//lets wait for systems back to finish 

super.onBackPressed(); 

//here we believe a fragment was popped, so we need to remove the fragment from ourbackstack 
if(fragmentBackStack.size()>0) 
{ 
    Log.d("custombackstack","before back: "+fragmentBackStack.size()+" current:"+fragmentBackStack.peek()); 

    fragmentBackStack.pop();    
} 
//after popping is the size > 0, if so we set current fragment from the top of stack, otherwise we default to home fragment. 
if(fragmentBackStack.size()>0) 
{   
    Log.d("custombackstack","after back: "+fragmentBackStack.peek()); 
currentFragment = fragmentBackStack.peek();   
} 
else 
{   
    //back stack empty 
    currentFragment = HOME_FRAGMENT; 
} 
Questions connexes