Erlo

对Activity的DecorView的包装(二)

时间:2018-10-11 09:56   阅读:43次   来源:博客园页面报错

点赞 打赏

×打赏

支付宝

微信


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

下一篇:AS插件-GsonFormat

评论留言

还没有评论留言,赶紧来抢楼吧~~

Erlo大厅()

* 这里是“吐槽厅”,所有人可看,只保留当天信息。

  • Erlo.vip2019-02-20 04:13:53Hello、欢迎使用吐槽厅,这里是个吐槽的地方。
  • 首页 笔记分享 Erlo动态 案例展示 搜索
    鼠标试试
    返回顶部