对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 ...
随机推荐
- inux中ifreq 结构体分析和使用(转)
标签: it 分类: socket 结构原型: struct ifreq{#define IFHWADDRLEN 6 union { char ifrn_name[IFNAMSIZ]; } if ...
- btcpool之StratumServer
一.简介 StratumServer(简称sserver)接收JobMaker发送的stratumjob消息,从http api获取用户列表,对外部矿机提供服务. 二.处理stratumjob消息 s ...
- Python中的sys.path.append()
当我们导入一个模块时:import xxx,默认情况下python解析器会搜索当前目录.已安装的内置模块和第三方模块 当运行脚本文件和导入模块不再同一目录下 import sys sys.path. ...
- 【论文速读】Yuliang Liu_2017_Detecting Curve Text in the Wild_New Dataset and New Solution
Yuliang Liu_2017_Detecting Curve Text in the Wild_New Dataset and New Solution 作者和代码 caffe版代码 关键词 文字 ...
- Spring boot 源码分析(一)SpringApplication.run(上)
SpringApplication.run(Main.class, args); 从这个方法开始讲吧: public static ConfigurableApplicationContext run ...
- Azure上搭建ActiveMQ集群-基于ZooKeeper配置ActiveMQ高可用性集群
ActiveMQ从5.9.0版本开始,集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper+LevelDB的实现方式. 本文主要介绍了在Windows环境下配置基于Zoo ...
- Color Schema 配色随笔
附pdf文件: ColorSchema.pdf
- maven 安装m2e 报错
Eclipse安装maven插件m2e m2e - http://m2eclipse.sonatype.org/sites/m2e m2e-extras - http://m2eclipse.sona ...
- Winfon 页签切换及窗体控件自适应
由于公司的业务调整,最近不仅开发bs,还有不熟悉的cs,人手也不足,项目还多,对于cs来说,算是小白,虽然是一个人,也是硬着头皮写,拖拽控件,自定义控件.一个项目下来,对cs有了很深的认识,这里好好感 ...
- linux软AP--hostapd+dhcpd
linux软AP--hostapd+dhcpd 2018年05月08日 ⁄ 综合 ⁄ 共 4908字 ⁄ 字号 小 中 大 ⁄ 评论关闭 随着手机.笔记本等无线设备的增多,公司里的家用三个无线路由器已 ...