4

这里是Activity.java的 Android 源代码。

特别是setContentView()第 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's 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's Fragment.onInflate()- 920 行,Fragment.onAttach()- 928 行,Fragment.onCreate()- 953 行,Fragment.onCreateView()- 967 行和Fragment.onViewCreated()- 991 行。

4

1 回答 1

2

实际的函数体在哪里实现?

private Window mWindow;

mWindow 通过以下方式初始化:

mWindow = PolicyManager.makeNewWindow(this);

在 attach() 方法中。查看 PolicyManager.java 中的 PolicyManager.makeNewWindow 方法。

Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);
sPolicy = (IPolicy)policyClass.newInstance();

public static Window makeNewWindow(Context context) {
    return sPolicy.makeNewWindow(context);
}

而且POLICY_IMPL_CLASS_NAMEcom.android.internal.policy.impl.Policy。所以看看Policy.java。这里是:

public Window makeNewWindow(Context context) {
    return new PhoneWindow(context);
}

并且setContentViewPhoneWindow.java

于 2013-06-05T00:31:20.123 回答