web-dev-qa-db-fra.com

Amener un fragment au premier plan (aucune récréation de fragment)

J'ai trois fragments F1 F2 F3 F4 sont tous accessibles depuis la barre latérale.

tous les quatre peuvent être appelés à tout moment et dans n'importe quel ordre,

Maintenant je veux si, on clique sur F1 (créé), puis ne crée plus jamais de F1, mais ramène seulement le fragment F1 au premier plan en utilisant le gestionnaire de fragments. Idem pour tous les autres fragments

Jusqu'ici j'ai essayé ceci pour chaque fragment dans mon conteneur (FRAGMENT ACTIVITY)

if (fragmentManager.findFragmentByTag("apps")==null) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

Fragment newFragment = new CategoriesFragment();
transaction.replace(R.id.content_frame, newFragment, "apps");
transaction.addToBackStack("apps");
transaction.commit();   
} else{

}

If part m'assure qu'aucun fragment n'est recréé (s'il est déjà créé), mais que dois-je écrire dans else pour que le fragment déjà créé puisse être présenté au premier plan dans la hiérarchie des vues

S'il vous plaît, aidez-moi, je suis coincé à cela pendant 2 jours.

21
Nitin Misra

Je mettrais ce code en classe d’activité, qui doit avoir FrameLayout avec id R.id.fragment_container .

private Fragment1 F1;
private Fragment2 F2;
private Fragment3 F3;
private Fragment4 F4;       

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

    F1 = new Fragment1();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F1).commit();
    F2 = new Fragment2();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F2).commit();
    F3 = new Fragment3();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F3).commit();
    F4 = new Fragment4();
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, F4).commit();

    //if needed show F1
    getSupportFragmentManager().beginTransaction().show(F1).commit();

}

Et ajoutez ceci pour le clic du bouton:

public void onBtnClick(View view){
    if(mShowF1){
        getSupportFragmentManager().beginTransaction().show(F1).commit();
        getSupportFragmentManager().beginTransaction().hide(F2).commit();
        getSupportFragmentManager().beginTransaction().hide(F3).commit();
        getSupportFragmentManager().beginTransaction().hide(F4).commit();
    }
    //...
}

Lorsque vous cliquez sur un bouton, vous pouvez afficher le fragment que vous souhaitez et masquer les autres.

NOTE (@ developer1011): .__ Pour utilisation après l'activité d'enregistrement de l'état appel commitAllowingStateLoss (). À utiliser avec précaution, car le fragment n'est pas restauré avec la restauration d'activité.

NOTE: MainActivity devrait implémenter OnFragmentInteractionListener pour chaque fragment.

public class MainActivity extends FragmentActivity implements Fragment1.OnFragmentInteractionListener, Fragment2.OnFragmentInteractionListener, Fragment3.OnFragmentInteractionListener, Fragment4.OnFragmentInteractionListener {//..

    @Override
    public void onFragmentInteraction(Uri uri) {
        //
    }
}
11
Solata

Récupérez le fragment par tag et replacez-le dans le conteneur,

else{
Fragment existingFragment = (CategoriesFragment)fragmentManager.findFragmentByTag("apps");
transaction.replace(R.id.content_frame,existingFragment, "apps");
transaction.addToBackStack("apps");
transaction.commit();
}

UPDATE: Vous pouvez utiliser masquer et afficher fragment pour éviter recreation.stord au lieu de "transaction.replace ()"

fragmentTransaction.hide(<oldFragment>);
fragmentTransaction.show(<newFragment>);
6
nikvs

Si vous essayez simplement d’ajouter une Fragment sans avoir à vous soucier de la recréer, je pense que cette méthode que j’ai écrite pour ajouter Fragment vous aidera.

public static void attachFragment ( int fragmentHolderLayoutId, Fragment fragment, Context context, String tag ) {


    FragmentManager manager = ( (AppCompatActivity) context ).getSupportFragmentManager ();
    manager.findFragmentByTag ( tag );
    FragmentTransaction ft = manager.beginTransaction ();

    if (manager.findFragmentByTag ( tag ) == null) { // No fragment in backStack with same tag..
        ft.add ( fragmentHolderLayoutId, fragment, tag );
        ft.addToBackStack ( tag );
        ft.commit ();
    }
    else {
        ft.show ( manager.findFragmentByTag ( tag ) ).commit ();
    }
}
2
erluxman
  1. Utilisez un simple ArrayList<Fragment> pour vos fragments et ajoutez-les dans l'ordre, de sorte que vous savez que get (0) recevra F1, get (1) obtiendra F2, etc.

  2. Créez les fragments en singletons. Dans chaque fragment, ajoutez un champ statique et une méthode:

     private static Fragment mMyInstance = null;
    
     public static Fragment newInstance() {
         if (mMyInstance == null) {
             mMyInstance = new F1();
         }
         return mMyInstance;
     }
    
  3. Créez les fragments avec la méthode statique et ajoutez-les à la liste de tableaux.

  4. Dans chaque fragment, ajoutez la commande setRetainInstance(true); à la méthode onCreate ().

Désormais, lorsque vous ajoutez le fragment à FragmentManager, onCreate() sera appelé seulement la première fois, mais onCreateView() sera appelé à chaque fois. Vous souhaitez gonfler la vue et câbler les widgets à chaque fois, juste au cas où votre activité aurait été recréée à cause d'un changement de configuration. Mais vous pouvez vérifier quelque chose que vous ajoutez pour voir si c'est la première fois ou non, et réinitialiser les widgets à leur état précédent sinon. Ainsi, vous aurez besoin de variables de membre dans vos fragments pour garder une trace de leur état. Remplacez onStop () pour enregistrer l'état et réappliquez-le dans onCreateView () après avoir connecté les widgets.

Ensuite, lorsque vous appuyez sur le bouton de la barre latérale, vous obtenez le fragment correspondant à ce bouton, supprimez le fragment précédent et ajoutez le fragment en cours avec FragmentManager (ou utilisez simplement la commande replace () à la place de remov ()/add ()). .

1
Rick Falck

Si vous utilisez le fragment de support, cette méthode statique fait le travail.

    /**
 * Takes a Fragment TAG and tries to find the fragment in the manager if it exists and bring it to front.
 * if not, will return false;
 * @param manager
 * @param tag
 */
public static boolean resurfaceFragment(FragmentManager manager, String tag ){
    Fragment fragment = manager.findFragmentByTag(tag);
    FragmentTransaction transaction = manager.beginTransaction();
    if (fragment!=null){
        for (int i = 0; i < manager.getFragments().size(); i++) {
            Fragment f =  manager.getFragments().get(i);
            transaction.hide(f);

        }
        transaction.show(fragment).commit();
        return true;
    }

    return false;
}
0
JDenais