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: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.javaFragment.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_NAMEですcom.android.internal.policy.impl.Policy。それでは、Policy.java を見てください。ここにあります:

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

そして、setContentViewはに実装されていますPhoneWindow.java

于 2013-06-05T00:31:20.123 に答える