欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

对Activity的DecorView的包装(二)

程序员文章站 2022-06-11 18:35:35
看了下公司的系统代码对于根布局decor_layout.xml的修改, 有所获. 前些时候才开始做系统开发的时候, 总想改改系统的源码, 至于原因: 人总是想装装, 在踩过几个别人修改的坑后, 还是觉得在不改源码的基础上, 尽量纳源码为自己所用还是挺好的. 代码如下: 该段代码的核心, 就在上面的 ......


看了下公司的系统代码对于根布局decor_layout.xml的修改, 有所获.

前些时候才开始做系统开发的时候, 总想改改系统的源码, 至于原因: 人总是想装装, 在踩过几个别人修改的坑后, 还是觉得在不改源码的基础上, 尽量纳源码为自己所用还是挺好的.

代码如下:

 1     public void wrapdecor(activity activity) {
 2 
 3         mwindow = activity.getwindow();
 4         if(mwindow == null){
 5             log.e(tag, "window is null");
 6             return;
 7         }
 8         
 9         view decorview = mwindow.getdecorview();
10         if (decorview == null) {
11             log.e(tag, "decorview is null");
12             return;
13         }
14 
15         viewgroup contentview = (viewgroup) decorview.findviewbyid(android.r.id.content);
16         if (contentview == null) {
17             log.e(tag, "decorview is null, have you called wrapdecor after activity#super.oncreate?");
18             return;
19         }
20 
21         final int childcount = contentview.getchildcount();
22         if (childcount == 0) {
23             // maybe called before activity#setcontentview
24             mpotentialerrorflag |= flag_potential_error_set_content;
25         }
26 
27         view[] children = new view[childcount];
28         for (int i = 0; i < childcount; i++) {
29             children[i] = contentview.getchildat(i);
30         }
31 
32         contentview.removeallviews();
33 
34         layoutinflater inflater = layoutinflater.from(activity);
35 
36         //===================== begin ========================
37 
38         // 此处即为自定义的decor_layout.xml文件
39         view wrapper = inflater.inflate(r.layout.decor_layout, null);
40 
41         viewgroup rawcontentview = (viewgroup) wrapper.findviewbyid(r.id.content);
42         if (childcount > 0) {
43             for (view child : children) {
44                 rawcontentview.addview(child);
45             }
46         }
47         //change for listactivity, add view first then setcontenview
48         activity.setcontentview(wrapper);
49 
50         //=====================   end   =======================
51 
52         // 获取自定义decor_layout中的控件
53         moptionskey = wrapper.findviewbyid(r.id.feature_bar_options);
54 
55         // 此处获取的是actionbar的控件, 由于项目中需要大量使用到actionbar, 
56         // 此处对覆盖actionbar对optionmenu的控制
57         actionbarview actionbarview = (actionbarview) decorview.findviewbyid(
58                 com.android.internal.r.id.action_bar);
59         if (actionbarview != null) {
60             // 覆盖actionbar对optionmenu的控制
61             actionbarview.setoverrideoverflowbutton(moptionskey);
62         } else {
63             log.d(tag, "actionbarview is null");
64             if (mwindow != null) {
65                 log.d(tag, "attempt to invoke setshouldoverrideresources access phonewindow");
66                 mwindow.setshouldoverrideresources(true);
67             } else {
68                  log.d(tag, "mwindow is empty, pls check it");
69             }
70         }
71     }

该段代码的核心, 就在上面的 begin 和 end 之间, 代码挺简单, 使用到包装的思想, 也就是包装设计模式.