对Activity的DecorView的包装(二)
程序员文章站
2023-11-02 14:33:52
看了下公司的系统代码对于根布局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 之间, 代码挺简单, 使用到包装的思想, 也就是包装设计模式.