【发布时间】:2015-12-03 14:44:29
【问题描述】:
Fragment.getContext() 的文档是这样说的
返回 Fragment 当前关联的上下文。
在 api 23 中引入 http://developer.android.com/reference/android/app/Fragment.html#getContext()
这是Application 还是Activity Context?
【问题讨论】:
Fragment.getContext() 的文档是这样说的
返回 Fragment 当前关联的上下文。
在 api 23 中引入 http://developer.android.com/reference/android/app/Fragment.html#getContext()
这是Application 还是Activity Context?
【问题讨论】:
简答
Fragment.getContext()返回使用fragment的activity的上下文
详情
由于Fragment类中的api 23被引入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() 方法中获取 Activity 的上下文之前有几个步骤。
1) 在Activity的初始化过程中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) 方法中设置。
【讨论】:
至于 FragmentActivity 和继承 - 'getContext()' 仍然会返回活动上下文,如果你检查源代码,你可能会看到。
【讨论】:
Fragment#getContext(),而不是FragmentActivity#getContext()。
Fragment#getContext()