概述
Dialog在Android中是一个很优秀的工具。在使用Dialog时,我们一般都会自定义要显示的内容布局。Dialog自带了三个方法来支持自定义内容布局。
public void setContentView (int layoutResID);
public void setContentView (View view);
public void setContentView (View view, ViewGroup.LayoutParams params);
这三个方法内部的实现原理都是一样的,只是其封装深度不同而已。三个方法可以说分别照顾了不同定制深度的开发者。
setContentView()流程
直接查看Dialog的源代码,如下图1所示。
【图1】
上图中mWindow在Dialog类中的定义如下:
import android.view.Window;
Window mWindow;
那么,它从何而来呢?如下图2所示。
【图2】
由上图2可知,在构造Dialog对象时,这个mWindow的值也被确定。它由PolicyManager提供。再往下跟系统代码。
makeNewWindow(Context)方法的实现如下:
// The static methods to spawn new policy-specific objects
public static Window makeNewWindow(Context context) {
return sPolicy.makeNewWindow(context);
}
还得继续往下跟。
import com.andorid.policy.internal.policy.impl.Policy;
/**
* {@hide}
*/
public class Policy implements IPolicy {
//...
public Window makeNewWindow(Context context) {
return new PhoneWindow(context);
}