Q:Fragment中getContext得到的context从哪来?
我们都知道Fragment获取Context时调用getContext()
源码:
class Fragment{
// Host this fragment is attached to.
FragmentHostCallback<?> mHost;
...
@Nullable
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}
...
}
Context来自于mHost.getContext()
,疑问点转向FragmentHostCallback
从什么地方赋值mContext
:
class FragmentHostCallback{
...
FragmentHostCallback(@NonNull FragmentActivity activity) {
this(activity, activity /*context*/, new Handler(), 0 /*windowAnimations*/);
}
FragmentHostCallback(@Nullable Activity activity, @NonNull Context context,
@NonNull Handler handler, int windowAnimations) {
mActivity = activity;
mContext = Preconditions.checkNotNull(context, "context == null");
mHandler = Preconditions.checkNotNull(handler, "handler == null");
mWindowAnimations = windowAnimations;
}
...
}
总结:Fragment中的
mActivity
和mContext
是在FragmentActivity
赋值的
延伸思考
- Context来自于
mHost.getContext()
,转向mHost
从什么地方赋值,发现来自于FragmentStateManager
class FragmentStateManager{
private final Fragment mFragment;
...
FragmentStateManager(@NonNull FragmentLifecycleCallbacksDispatcher dispatcher,
@NonNull Fragment fragment) {
mDispatcher = dispatcher;
mFragment = fragment;
}
...
void attach(@NonNull FragmentHostCallback<?> host, @NonNull FragmentManager fragmentManager,
@Nullable Fragment parentFragment) {
...
mFragment.mHost = host;
...
}
}
attach(...)
由FragmentManager
调用
public abstract class FragmentManager {
...
void moveToState(@NonNull Fragment f, int newState) {
...
switch (f.mState) {
case Fragment.INITIALIZING:
...
fragmentStateManager.attach(mHost, this, mParent);
...
}
...
}
void attachController(@NonNull FragmentHostCallback<?> host,
@NonNull FragmentContainer container, @Nullable final Fragment parent) {
mHost = host;
}
}
- 跟踪到
FragmentController
中的attachHost(@Nullable Fragment parent)
class tesst{
private final FragmentHostCallback<?> mHost;
/**
* Returns a {@link FragmentController}.
*/
@NonNull
public static FragmentController createController(@NonNull FragmentHostCallback<?> callbacks) {
return new FragmentController(checkNotNull(callbacks, "callbacks == null"));
}
private FragmentController(FragmentHostCallback<?> callbacks) {
mHost = callbacks;
}
...
public void attachHost(@Nullable Fragment parent) {
mHost.mFragmentManager.attachController(
mHost, mHost /*container*/, parent);
}
...
}
- 跟踪到引用类
FragmentActivity
class FragmentActivity {
final FragmentController mFragments = FragmentController.createController(new HostCallbacks());
}
- 终于看到mHost初始化的类
new HostCallbacks()
class HostCallbacks extends FragmentHostCallback<FragmentActivity>{
public HostCallbacks() {
super(FragmentActivity.this /*fragmentActivity*/);
}
}
- 最终来到
FragmentHostCallback
,看到mActivity
和mContext
的初始化
class FragmentHostCallback{
...
FragmentHostCallback(@NonNull FragmentActivity activity) {
this(activity, activity /*context*/, new Handler(), 0 /*windowAnimations*/);
}
FragmentHostCallback(@Nullable Activity activity, @NonNull Context context,
@NonNull Handler handler, int windowAnimations) {
mActivity = activity;
mContext = Preconditions.checkNotNull(context, "context == null");
mHandler = Preconditions.checkNotNull(handler, "handler == null");
mWindowAnimations = windowAnimations;
}
...
}