【发布时间】:2013-05-27 17:13:48
【问题描述】:
我想知道Activity.java 的setContentView() 方法究竟在调用/执行什么操作。
Here 是 Android 源代码和第 1646 行的代码存根:
public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
}
这是我的踪迹……
在第 642 行,我们知道它的类型是 android.view.Window
private Window mWindow;
但是Window.java 是一个抽象类。在第 738 行,该方法也是抽象的:
public abstract void setContentView(int layoutResID);
实际的函数体在哪里实现?
回到Activity.java文件,在第3746行,我们发现mWindow的一些初始化:
mWindow = PolicyManager.makeNewWindow(this);
mWindow.setCallback(this);
...
好吧,关于com.android.internal.policy.PolicyManager的makeNewWindow():
public static Window makeNewWindow(Context context) {
return sPolicy.makeNewWindow(context);
}
和
private static final IPolicy sPolicy;
Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);
sPolicy = (IPolicy)policyClass.newInstance();
IPolicy.java 是一个接口,这意味着根本没有实现。
我的踪迹不能再进一步了。请你帮帮我好吗?
特别是,我知道Activity.setContentView() 最终会调用android.support.v4.app.Fragment.java 的Fragment.onInflate() - 920 行、Fragment.onAttach() - 928 行、Fragment.onCreate() - 953 行、Fragment.onCreateView() - 967 行和@987654347 @ - 第 991 行。
【问题讨论】:
-
“特别是,我知道 Activity.setContentView() 最终会调用 android.support.v4.app.Fragment.java 的 Fragment.onInflate()”——不,它不会。
Activity对android.support.v4.app.Fragment一无所知。Activity可能对android.app.Fragment有所了解。android.support.v4.app.FragmentActivity可能对android.support.v4.app.Fragment有所了解。 -
是的@CommonsWare,你是对的。其实根据源码,
Fragment.onAttach()、Fragment.onCreate()、Fragment.onCreateView()和Fragment.onViewCreated()是在FragmentActivity.onCreate()>mFragments.dispatchCreate()>FragmentManager.moveToState(Fragment.CREATED, false)中调用的。但令人惊讶的是,我在setContentView()之前和之后添加了一些System.out.println()s,以及在那些Fragment方法中。看来那些Fragment方法是在setContentView()中调用的。
标签: java android abstract-class android-source android-fragmentactivity