activity window 获取setContentView的基视图(getContentView)
来源:互联网 发布:出境旅游数据 编辑:程序博客网 时间:2024/06/07 22:50
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
0 0
- activity window 获取setContentView的基视图(getContentView)
- setContentView对应的getContentView
- Activity 获取 view getContentView
- Activity 获取 view getContentView
- Activity中的Window的setContentView
- [Android] Activity怎么获取contentView? 自定义getContentView()
- Activity获取setContentView()后得到的View
- Activity的setContentView解析
- 获取activity的根视图
- Android-- 通过setContentView切换Activity的View,保存动态修改后的视图
- Android-- 通过setContentView切换Activity的View,保存动态修改后的视图
- android 通过setContentView切换Activity的View,保存动态修改后的视图
- android 通过setContentView切换Activity的View,保存动态修改后的视图
- Android学习笔记03: 通过setContentView切换Activity的View,保存动态修改后的视图
- Activity 的 setContentView draw时机
- Activity的setContentView源码分析
- 学习android Activity的setContentView
- android Activity.setContentView和Window PhoneWindow类学习
- Android Support Library
- Android Studio 遇到的错误、异常和总结
- iOS的layout机制相关方法
- treap模版
- Mybatis框架
- activity window 获取setContentView的基视图(getContentView)
- Docker安装nginx
- 找工作——jvm复习(一)
- HDU 1509 windows message queue
- 电子工程师最关心的10个问题,看完有答案没?
- ubuntu 安装qt4
- 如何在Xib中添加自定义的属性?
- UVALive 4127
- nginx配置ssl