web-dev-qa-db-fra.com

Android: la nouvelle méthode getContext () de Fragment est quel contexte?

La documentation pour Fragment.getContext() le dit

renvoie le contexte auquel le fragment est actuellement associé.

Il a été introduit dans api 23 http://developer.Android.com/reference/Android/app/Fragment.html#getContext ()

Est-ce la Application ou ActivityContext?

11
user2968401

Réponse courte

Fragment.getContext() retourne le contexte de l'activité où fragment est utilisé

Détails

Depuis que l’API 23 dans la classe Fragment a été introduite dans le champ mHost 

// Activity this fragment is attached to.
FragmentHostCallback mHost;

Et Fragment.getContext() l'utilise pour obtenir le contexte:

/**
 * Return the {@link Context} this fragment is currently associated with.
 */
public Context getContext() {
    return mHost == null ? null : mHost.getContext();
}

Avant d'obtenir le contexte d'activité dans la méthode getContext() de fragment, vous devez suivre plusieurs étapes.

1) Au cours de l'initialisation de l'activité, la variable FragmentController est créée:

final FragmentController mFragments = FragmentController.createController(new HostCallbacks());

2) Il utilise la classe HostCallbacks (la classe interne de Activity)

class HostCallbacks extends FragmentHostCallback<Activity> {
    public HostCallbacks() {
        super(Activity.this /*activity*/);
    }
...
}

3) Comme vous pouvez le constater, mFragments conserve la référence au contexte de l'activité.

4) Lorsque l'application crée un fragment, elle utilise FragmentManager. Et son instance est tirée de mFragments (depuis le niveau 23 de l’API)

/**
 * Return the FragmentManager for interacting with fragments associated
 * with this activity.
 */
public FragmentManager getFragmentManager() {
    return mFragments.getFragmentManager();
}

5) Enfin, le champ Fragment.mHost est défini dans la méthode FragmentManager.moveToState(Fragment f, int newState, int transit, int transitionStyle, boolean keepActive).

13
Ilya Tretyakov

En ce qui concerne FragmentActivity et inherited - 'getContext ()' retournera toujours le contexte d'activité, vous pouvez le voir si vous vérifiez le code source.

0
dtx12