Ответ 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)
.