对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 ...
随机推荐
- facebook分享
http://bbs.mob.com/forum.php?mod=viewthread&tid=19104&page=1&extra=#pid40942 应用审核 http: ...
- RxSwift 操作符
RxSwift 操作符 (throttle) https://blog.csdn.net/weixin_38318852/article/details/80334838 RxSwift 操作符 (w ...
- Android创建列表并为列表添加数据
在Android开发中经常会用到ListView,也就是列表,而列表的内容需要如何决定呢,很好的方法是使用各种adapter 首先来看看用entries添加列表内容 在布局文件中,创建一个ListVi ...
- 关于Android的fragment的使用
fragment的静态使用 首先创建两个fragment,就把fragment当成activity去写布局,第一个是fragment_title: <LinearLayout xmlns:and ...
- LVS,Keepalived,HAproxy区别与联系
LVS,Keepalived,HAproxy区别与联系 LVS 全称Linux Virtual Server,也就是Linux虚拟服务器,由章文嵩(现就职于于淘宝,正因为如此才出现了后来的fullna ...
- Pycharm 自定义文件模板
Pycharm 自定义文件模板 每次新建文件都有相同的代码框架,每次重复敲浪费了程序员的寿命啊 按照下面方式自定义自己的模板:
- centos7中安装mysql5.6版本 + 主从复制
centos安装5.6版本:CentOS7下使用YUM安装MySQL5.6 主从复制:Mysql主从复制与读写分离原理及配置教程 主从复制问题及配置 卸载和安装5.7版本:CentOS 7 安装与卸载 ...
- Python3学习之路~7.2 类的特殊成员方法
1. __doc__ 表示类的描述信息 class Dog(object): """ 这个类是描述狗这个对象的 """ def func(s ...
- Spring Security 内置过滤器表
别名 Filter 类 CHANNEL_FILTER ChannelProcessingFilter SECURITY_CONTEXT_FILTER SecurityContextPersistenc ...
- arcgis 画图工具
arcgis 4.x系列JavaScript API在4.4及以前的版本对画图工具(Draw)是不支持的,自4.5版本后才提供Draw的类.相关连接:https://developers.arcgis ...