activity window 获取setContentView的基视图(getContentView)
2016-03-21 18:39
691 查看
android setContentView后如何get回来
setContentView 流程(window DecorView 装载流程)
一、activity window 引出 PhoneWindow类setContentView -> getWindow().setContentView(view)
getWindow() -> mWindow = new PhoneWindow(this);
二、 PhoneWindow 类分析
分析setContentView 知道里主要做两步操作:
->1 装载DecorView 基础布局 installDecor()
->2 装载setContentView的具体布局 mLayoutInflater.inflate(layoutResID, mContentParent);
@Override public void setContentView(int layoutResID) { if (mContentParent == null) { //1、装载 DecorView installDecor(); } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) { mContentParent.removeAllViews(); } if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) { final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,getContext()); transitionTo(newScene); } else { //2、把layoutResID 装载到 R.id.content对应的ViewGroup mLayoutInflater.inflate(layoutResID, mContentParent); } mContentParent.requestApplyInsets(); final Callback cb = getCallback(); if (cb != null && !isDestroyed()) { cb.onContentChanged(); } }
布局装载图如下,后面详细描述加载的2步:
2.1、装载过程(基础模板layoutId, 与activity 传入的layout)
->1、generateDecor() 加载DecorView 作为最外层布局。比较简单该函数不展开
->2.1、generateLayout(mDecor) 装载基础模板布局(如:R.layout.screen_title 或者 R.layout.screen_simple)
->2.2、generateLayout(mDecor) 找到R.id.content 的viewGroup 作为 mContentParent
->补充 findViewById -> getDecorView().findViewById(id) -> (getDecorView() 就是 mDecor)
private void installDecor() { if (mDecor == null) { //1、加载DecorView(extends FrameLayout) 作为最外层布局 mDecor = generateDecor(); mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); mDecor.setIsRootNamespace(true); if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) { mDecor.postOnAnimation(mInvalidatePanelMenuRunnable); } } if (mContentParent == null) { //2.1、装载基础模板布局(如:R.layout.screen_title 或者 R.layout.screen_simple) //2.2、找到R.id.content 的viewGroup 作为 mContentParent mContentParent = generateLayout(mDecor); } ... } protected ViewGroup generateLayout(DecorView decor) { ... else if ((features & (1 << FEATURE_NO_TITLE)) == 0) { // If no other features and not embedded, only need a title. // If the window is floating, we need a dialog layout if (mIsFloating) { TypedValue res = new TypedValue(); getContext().getTheme().resolveAttribute( R.attr.dialogTitleDecorLayout, res, true); layoutResource = res.resourceId; } else if ((features & (1 << FEATURE_ACTION_BAR)) != 0) { layoutResource = a.getResourceId( R.styleable.Window_windowActionBarFullscreenDecorLayout, R.layout.screen_action_bar); } else { layoutResource = R.layout.screen_title; } // System.out.println("Title!"); } else if ((features & (1 << FEATURE_ACTION_MODE_OVERLAY)) != 0) { layoutResource = R.layout.screen_simple_overlay_action_mode; } else { // Embedded, so no decoration is needed. layoutResource = R.layout.screen_simple; // System.out.println("Simple!"); } mDecor.startChanging(); //2.1、装载基础模板layoutId 到decor (mDecor) View in = mLayoutInflater.inflate(layoutResource, null); decor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); mContentRoot = (ViewGroup) in; //2.2、找到R.id.content 对应的ViewGroup 作为contentParent(mContentParent) //ID_ANDROID_CONTENT = com.android.internal.R.id.content; //findViewById -> getDecorView().findViewById(id) -> (getDecorView() -> mDecor) ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT); if (contentParent == null) { throw new RuntimeException("Window couldn't find content container view"); } ... return contentParent; }
三、 获取setContentView的layout
public static View getContentView(Activity context) { return ((ViewGroup)context.findViewById(android.R.id.content)).getChildAt(0); }
参考
[1] http://blog.csdn.net/qinjuning/article/details/7226787
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories