web-dev-qa-db-fra.com

Android: Fragments de retour

J'essaie 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:

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. Le dernier fragment devrait être retiré à mon retour. Avant je vais implémenter des méthodes sur les activités

public void onBackPressed(){}

pour supprimer le dernier fragment, je veux savoir si je gère correctement le changement de fragment. On dirait qu'il me manque quelque chose ici ..

38
Oritm

Si vous voulez vraiment remplacer le fragment, utilisez la méthode replace () au lieu de faire un remove () et un add ().

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

N'oubliez pas de faire addToBackStack (null) pour que votre état précédent soit ajouté au backstack, ce qui vous permettra de revenir en arrière avec le bouton Précédent.

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 (recherchez la fonction replace ()).

86
K Roobroeck

Il suffit de supprimer d'abord et l'appel super.onBackPressed

public void onBackPressed(){

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

}
4
Pratik
//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;
}
0
TanvirChowdhury