当前位置: 移动技术网 > IT编程>移动开发>Android > 对Activity的DecorView的包装(二)

对Activity的DecorView的包装(二)

2018年10月09日  | 移动技术网IT编程  | 我要评论

北京博美犬,籽焱寺,淘气包欧皮皮


看了下公司的系统代码对于根布局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 之间, 代码挺简单, 使用到包装的思想, 也就是包装设计模式.

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网