Fragment中getContext得到的context从哪来?(基于androidx.fragment:1.2.5源码)
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;
}
...
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端