对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 ...
随机推荐
- 4. Scala程序流程控制
4.1 程序流程控制说明 在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句,顺序控制,粉质控制,循环控制 温馨提示:Scala语言中控制结构和Java语言中的 ...
- Python+Selenium+PageObject
一.安装page_objects测试库 二.目录介绍 1.pages包:用于各界面元素定位,如BaseLoginPage.py 2.testcases包:用于编写各功能测试用例,如Login.py 3 ...
- jedis & common pool
http://mvnrepository.com/artifact/redis.clients/jedis http://mvnrepository.com/artifact/org.apache.c ...
- centos7设置静态IP地址
1.查看IP配置信息 ifconfig 如上图所示,我的em1网卡已配置好 2.编辑em1对应的配置文件,位于/etc/sysconfig/network-scripts/ifcfg-你的网卡名字 操 ...
- C# Asp.net中简单操作MongoDB数据库(二)
C# Asp.net中简单操作MongoDB数据库(一) , mongodb数据库连接可以回顾上面的篇幅. 1.model类: public class BaseEntity { /// < ...
- php java aes
class CryptAES{ protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB; protecte ...
- Java8(1)之Lambda表达式初步与函数式接口
Lambda表达式初步 介绍 什么是Lambda表达式? 在如 Lisp.Python.Ruby 编程语言中,Lambda 是一个用于表示匿名函数或闭包的运算符 为何需要lambda表达式? 在 Ja ...
- 二、多功能提示框——MBProgressHUD
概述 (注:图片仅展示部分功能,图片来自github) MBProgressHUD是一个Objective-C开源库,它可以让你在UI界面界面上插入一个透明的方框,伴以文字或进图条等,从而提示一些后台 ...
- OO第二单元总结(多线程的电梯调度)
经过第一单元作业的训练,在做第二单元的作业的时候,要更加的有条理.但是第二次作业多线程的运行,带来了更多的运行的不确定性.呈现出来就是程序会出现由于线程安全问题带来的不可复现的bug.本单元的作业也让 ...
- 23.C# 语言的改进
1.对象初始化器 class Curry { public string MainIngredient{get;set;} public string Style { get; set; } publ ...