Android减少布局层次--有关Activity根视图DecorView的思考

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");     
  
  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值