1 Android应用图层
一直觉得有关DecorView还是有些问题没有搞清楚,今天在看了一点有关SurfaceFlinger的内容以后,顿时突发奇想,想到之前的问题,之前的思考是:
虽然可以将DecorView作为Activity布局的父View,也就是只存在 DecorView---->ActivityLayout两层,但是经过试验还是会存在Title Bar,或者说是现在的Action Bar,尝试如下:
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
ViewGroup group =(ViewGroup)getWindow().getDecorView();
LayoutInflater.from(this).inflate(R.layout.activity_main, group, true);
ViewServer.get(this).addWindow(this);
}
一个简单的APP运行出来看到的View结构图就是下面这样:
图中左右两边相同颜色的区域是对应的,下面是详细的View tree结构图:
可以看到即使像上面那样写,在DecorView下面有3个子View,放大看一下:
DecorView里面包含:
(1)ActionBarOverklayLayout : ActionBar带来的一个布局,遍布了除了第三层最上端View的所有区域
(2)RelativeLayout : Activity的Layout(上述的activity_main布局)
(3)View : 屏幕最上端状态栏的背景
可以看到activity_main中的根布局RelativeLayout和ActionBarOverklayLayout 并列的,虽然减少了Activity中布局的层次,但是还是存在ActionBarOverklayLayout 这个我们实际上可能不需要的布局。
2 改进--减少层次
上面的改法有很多的问题,首先DecorView是一个FrameLayout,里面的所有的内容简单的叠在了一起,上面的RelativeLayout里面其实放了一个TextVIew,显示“Hello world”,但是都被其余层重叠了,所以看不到(仔细看勉强能看到),顺理成章想到DecorView作为一个Viewgroup,自然能够进行View的add和remove操作,于是想把其余的都remove删掉,不就只剩下Activity的Layout,于是改了一下代码:
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
ViewGroup group =(ViewGroup)getWindow().getDecorView();
group.removeAllViews();
LayoutInflater.from(this).inflate(R.layout.activity_main, group, true);
ViewServer.get(this).addWindow(this);
}
结果崩溃了,信息如下:
看信息好像是和ActionBar有关,但是还是没有什么头绪,于是逐行加log看看到底是在onCreate的哪一行出现这样的问题,其实看上面的崩溃信息的调用栈就知道和onCreate没有关系,应该是在onCreate的后面哪一步调用的时候出现了问题,但是还是尝试了一下:
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("onCreate0");
ViewGroup group =(ViewGroup)getWindow().getDecorView();
System.out.println("onCreate1");