Подтвердить что ты не робот

Android: Fragment Новый метод getContext() - это какой контекст?

Документы для Fragment.getContext() говорят, что он

возвращает контекст, с которым в данный момент связан фрагмент.

Он был представлен в api 23 http://developer.android.com/reference/android/app/Fragment.html#getContext()

Является ли это Application или Activity Context?

4b9b3361

Ответ 1

Короткий ответ

Fragment.getContext() возвращает контекст активности, в котором используется фрагмент

Подробнее

Так как api 23 в классе Fragment было введено поле mHost

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

И Fragment.getContext() использует его для получения контекста:

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

Есть несколько шагов, прежде чем вы получите контекст действия в методе фрагмента getContext().

1) Во время инициализации активности создается FragmentController:

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

2) Он использует класс HostCallbacks (внутренний класс Activity)

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

3) Как вы можете видеть, mFragments сохранить ссылку на контекст активности.

4) Когда приложение создает фрагмент, он использует FragmentManager. И экземпляр его берется из mFragments (начиная с уровня API 23)

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

5) Наконец, поле Fragment.mHost установлено в методе FragmentManager.moveToState(Fragment f, int newState, int transit, int transitionStyle, boolean keepActive).

Ответ 2

Что касается FragmentActivity и inherited - 'getContext()' все равно вернет контекст активности, вы можете увидеть это, если вы проверите исходный код.