FragmentManager à partir du contexte

J'ai créé une nouvelle classe View . Dans cette classe, j'ai besoin d'accéder au FragmentManager , mais je n'arrive pas à comprendre comment.

Puis-je accéder au FragmentManager à partir d'un contexte?

CustomView extends LinearLayout
32

5 Réponses

Seulement si le contexte donné étend l'activité (Post-Honeycomb) ou FragmentActivity (pré-nid d'abeilles).

Dans ce cas, vous devez être sûr à 100% que c'est une activité utilisant la réflexion ou l'essai.

try{
  final Activity activity = (Activity) context;

 //Return the fragment manager
  return activity.getFragmentManager();

 //If using the Support lib.
 //return activity.getSupportFragmentManager(); 

} catch (ClassCastException e) {
  Log.d(TAG, "Can't get the fragment manager with this");
}

Je pense que je recommande de refactoring donc un View est vraiment juste pour montrer des choses et ne devrait pas réellement modifier l'état de votre application, mais c'est mon opinion.

48
ajouté
Un DialogFragment contient la vue en question. J'ai essentiellement un DialogFragment qui est divisé en sections en fonction du bouton actuellement sélectionné, je montre la vue appropriée. J'ai divisé chaque section affichable dans sa propre vue. J'aurais utilisé un fragment, mais je ne peux pas intégrer un fragment dans un fragment.
ajouté l'auteur Steve, source
Je vais juste trouver la vue par id, et passer une référence à l'activité.
ajouté l'auteur Steve, source
C'est ce qu'il fait. Le DialogFragment permute les vues. Cependant, j'ai les vues contenant une certaine logique, et éventuellement afficher d'autres fragments de dialogue en réponse à l'utilisation des événements, de sorte que les vues ont besoin d'un moyen d'obtenir le gestionnaire de fragments. Je sais qu'il n'est pas recommandé d'avoir des vues contenant de la logique .. Je ne suis pas sûr d'une meilleure façon de diviser les sections.
ajouté l'auteur Steve, source
Pourquoi ne pas avoir simplement l'échange de vue du handle DialogFragment? Il semble que ce serait aussi compliqué que ce que vous essayez de faire.
ajouté l'auteur DeeV, source
@LeiLeyba: Les fragments ont des méthodes "getFragmentManager ()" et "getChildFragmentManager ()", donc je ne suis pas sûr de ce que vous demandez. Ceux-ci (probablement) retourneront null si le fragment n'est pas attaché à une activité cependant. Vous pouvez également utiliser "getActivity (). GetFragmentManager ()" pour obtenir le FragmentManager utilisé.
ajouté l'auteur DeeV, source
"Dans ce cas, vous devez être sûr à 100% que c'est une activité utilisant la réflexion ou l'essai." Ou simplement utiliser l'opérateur instanceof est encore mieux.
ajouté l'auteur Zsolt Safrany, source
Et si ça s'étend à Fragment?
ajouté l'auteur Lei Leyba, source

Si vous utilisez des fragments de support, vous voulez probablement:

try {
  FragmentManager fragmentManager = ((FragmentActivity) context).getSupportFragmentManager();
} catch (ClassCastException e) {
  Log.e(TAG, "Can't get fragment manager");
}
30
ajouté

C'est ce qui a fonctionné pour moi:

Context mContext;
...


//Get FragmentManager
FragmentManager fragmentManager = ((Activity) mContext).getFragmentManager();

(Bien sûr, vous devez d'abord initialiser mContext)

5
ajouté
quelle est cette logique de casting, comment cela a rendu possible
ajouté l'auteur blackHawk, source

Vous pouvez accéder à FragmentManager (ou à SupportFragmentManager) dans une application - mais comme d'autres réponses le suggèrent, vous ne pouvez le faire que via une instance d'activité.

Cependant, vous pouvez accéder à FragmentManager via une activité sans avoir besoin d'appeler directement les activités à l'aide de l'interface ActivityLifecycleCallbacks:

registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks {

    @Override
    public void onActivityCreated(Activity activity, Bundle bundle) {
        activity.getFragmentManager()
        if(activity instanceof FragmentActivity) {
            ((FragmentActivity)activity).getSupportFragmentManager();
        }
        unregisterActivityLifecycleCallbacks(this);
    }

    ...
3
ajouté

Étant donné que votre objet de contexte ne peut pas toujours être directement converti en Activity, cette méthode est plus fiable:

@Nullable
public static Activity getActivityFromContext(@NonNull Context context){
    while (context instanceof ContextWrapper) {
        if (context instanceof Activity) return (Activity) context;
        context = ((ContextWrapper)context).getBaseContext();
    }
    return null; //we failed miserably 
}
1
ajouté