对Activity的DecorView的包装(二)
看了下公司的系统代码对于根布局decor_layout.xml的修改, 有所获.
前些时候才开始做系统开发的时候, 总想改改系统的源码, 至于原因: 人总是想装装, 在踩过几个别人修改的坑后, 还是觉得在不改源码的基础上, 尽量纳源码为自己所用还是挺好的.
代码如下:
public void wrapDecor(Activity activity) {
mWindow = activity.getWindow();
if(mWindow == null){
Log.e(TAG, "Window is null");
return;
}
View decorView = mWindow.getDecorView();
if (decorView == null) {
Log.e(TAG, "DecorView is null");
return;
}
ViewGroup contentView = (ViewGroup) decorView.findViewById(android.R.id.content);
if (contentView == null) {
Log.e(TAG, "DecorView is null, have you called wrapDecor after Activity#super.onCreate?");
return;
}
final int childCount = contentView.getChildCount();
if (childCount == 0) {
// Maybe called before Activity#setContentView
mPotentialErrorFlag |= FLAG_POTENTIAL_ERROR_SET_CONTENT;
}
View[] children = new View[childCount];
for (int i = 0; i < childCount; i++) {
children[i] = contentView.getChildAt(i);
}
contentView.removeAllViews();
LayoutInflater inflater = LayoutInflater.from(activity);
//===================== begin ========================
// 此处即为自定义的decor_layout.xml文件
View wrapper = inflater.inflate(R.layout.decor_layout, null);
ViewGroup rawContentView = (ViewGroup) wrapper.findViewById(R.id.content);
if (childCount > 0) {
for (View child : children) {
rawContentView.addView(child);
}
}
//change for listActivity, add view first then setContenView
activity.setContentView(wrapper);
//===================== end =======================
// 获取自定义decor_layout中的控件
mOptionsKey = wrapper.findViewById(R.id.feature_bar_options);
// 此处获取的是ActionBar的控件, 由于项目中需要大量使用到ActionBar,
// 此处对覆盖ActionBar对OptionMenu的控制
ActionBarView actionBarView = (ActionBarView) decorView.findViewById(
com.android.internal.R.id.action_bar);
if (actionBarView != null) {
// 覆盖ActionBar对OptionMenu的控制
actionBarView.setOverrideOverflowButton(mOptionsKey);
} else {
Log.d(TAG, "actionBarView is null");
if (mWindow != null) {
Log.d(TAG, "Attempt to invoke setShouldOverrideResources access PhoneWindow");
mWindow.setShouldOverrideResources(true);
} else {
Log.d(TAG, "mWindow is empty, pls check it");
}
}
}
该段代码的核心, 就在上面的 begin 和 end 之间, 代码挺简单, 使用到包装的思想, 也就是包装设计模式.
对Activity的DecorView的包装(二)的更多相关文章
- Android界面架构(Activity,PhoneWiondow,DecorView)简介
在一个Android应用程序中,用户界面通过View和ViewGroup对象构建.所有View的子类成为"Widget",所有ViewGroup的子类成为"Layout& ...
- 简析Window、Activity、DecorView以及ViewRoot之间的错综关系
一.职能简介 Activity Activity并不负责视图控制,它只是控制生命周期和处理事件.真正控制视图的是Window.一个Activity包含了一个Window,Window才是真正代表一个窗 ...
- Activity工作流框架入门(二)API使用DEMO
工作流API使用Demo package activity.demo.test; import java.io.File; import java.io.FileInputStream; import ...
- Activity之间传递参数(二)
------siwuxie095 传递数据包 1.传递数据包要用到Bundle,MainActivity.java中: package com.siwuxie095.sendargs; import ...
- ANDROID基础ACTIVITY篇之ACTIVITY的生命周期(二)
除了Activity的七大生命周期方法外外,还有两个相当重要的方法需要大家熟记那就是onSavelnstanceState()和onRestoreinstanceState(). 那么什么时候会调用这 ...
- Android Studio之多个Activity的滑动切换(二)
1.因为Android界面上的全部控件一般都位于Layout控件(比方RelativeLayout)之上,而布局控件能够设置响应touch事件,所以能够通过布局控件的setOnTouchListen来 ...
- Activity启动场景Task分析(二)
场景分析 下面通过启动Activity的代码来分析一下: 1.桌面 首先,我们看下处于桌面时的状态,运行命令: adb shell dumpsys activity 结果如下 ACTIVITY MAN ...
- Android面试收集录11 Window+Activity+DecorView+ViewRoot之间的关系
一.职能简介 Activity Activity并不负责视图控制,它只是控制生命周期和处理事件.真正控制视图的是Window.一个Activity包含了一个Window,Window才是真正代表一个窗 ...
- Service 启动Activity
1, 在BroadcastReceiver中启动Activity的问题 * * 如果在BroadcastReceiver的onReceive()方法中如下启动一个Activity * Inten ...
随机推荐
- WangEditor+thinkphp5【真实可用+原创】
今天公司要编辑文章,一开始准备用ueditor,但是到了linux环境下一直不行,所以最终放弃.改用另外一个编辑器WangEditor.更加轻量级. 遇到最大的问题是 一个是图片上传,一个是div中的 ...
- Linux学习----gdb调试(指针的指针)
昨天遇到一个很奇怪的问题,如下: 按照理论,最后*p的值应该是99,不知为什么是15了,所以今天记录用gdb调试的过程,并熟悉gdb的使用. (调试过程参考:http://www.cnblogs.co ...
- Linux服务器在SSH客户端如何实现免密登录
一.SSH客户端Setting 配置 key , 创建生成公钥导出文件. 二.服务器 master 上生成密钥 通过执行命令 ssh-keygen -t rsa 来生成我们需要的密钥. ssh-ke ...
- 浅谈最长上升子序列(LIS)
一.瞎扯的内容 给一个长度为n的序列,求它的最长上升子序列(LIS) 简单的dp n=read(); ;i<=n;i++) a[i]=read(); ;i<=n;i++) ;j<i; ...
- mysql实现开窗函数
mysql实现开窗函数 http://blog.itpub.net/29989552/viewspace-2123077/ 学习过oracle的应该知道,oracle中的分析函数功能十分强大,包括ms ...
- SQL SERVER数据库附加是只读的解决方法
使用sa登录SQL Server2008附加数据库,附加之后数据库为只读的, 点数据库-->“属性”-->“选项”-->“状态”, 发现“数据库为只读”这一项为True,改为fals ...
- 2018-2019-2 网络对抗技术 20165236 Exp2 后门原理与实践
2018-2019-2 网络对抗技术 20165236 Exp2 后门原理与实践 一.实验内容 (3.5分) (1)使用netcat获取主机操作Shell,cron启动 (0.5分) (2)使用soc ...
- Vue框架创建项目常遇到问题
利用npm安装cnpm时出现的错误 npm WARN deprecated socks@1.1.10: If using 2.x branch, please upgrade to at least ...
- C语言第02次作业--循环结构
1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 1- 经过这两周的学习,我深切地体会C语言非常的难(对于我而言).大部分情况都是题目不理解和没有思路,或者编译 ...
- Oracle 10g RAC OCR、Voting disk更换
环境:OEL 5.7 + Oracle 10.2.0.5 RAC 需求:更换存储,OCR.Voting disk同时需要更换到新存储. 1.替换OCR 2.替换voting disk 1.替换OCR ...