`
mmdev
  • 浏览: 13250558 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Android_View,ViewGroup,Window之间的关系

 
阅读更多

一、首先说说ViewViewGroup

  Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的。所有View的子类成为”Widget”,所有ViewGroup的子类成为”Layout”。View和ViewGroup之间采用了组合设计模式,可以使得“部分-整体”同等对待。ViewGroup作为布局容器类的最上层,布局容器里面又可以有View和ViewGroup。

二、LayoutInflaterLayoutInflater.inflate()这两个是什么意思?

LayoutInflater是一个用来实例化XML布局文件为View对象的类

LayoutInflater.infalte(R.layout.test,null)用来从指定的XML资源中填充一个新的View

三、ActivityWindowView之间的关系

而当我们运行程序的时候,有一个setContentView()方法,Activity其实不是显示视图(直观上感觉是它),实际上Activity调用了PhoneWindow的setContentView()方法,然后加载视图,将视图放到这个Window上,而Activity其实构造的时候初始化的是Window(PhoneWindow),Activity其实是个控制单元,即可视的人机交互界面。

打个比喻:

Activity是一个工人,它来控制Window;Window是一面显示屏,用来显示信息;View就是要显示在显示屏上的信息,这些View都是层层重叠在一起(通过infalte()和addView())放到Window显示屏上的。而LayoutInfalter就是用来生成View的一个工具,XML布局文件就是用来生成View的原料

再来说说代码中具体的执行流程

setContentView(R.layout.main)其实就是下面内容。(注释掉本行执行下面的代码可以更直观)

getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main,null))

即运行程序后,Activity会调用PhoneWindow的setContentView()来生成一个Window,而此时的setContentView就是那个最底层的View。然后通过LayoutInflater.infalte()方法加载布局生成View对象并通过addView()方法添加到Window上,(一层一层的叠加到Window上)

所以,Activity其实不是显示视图,View才是真正的显示视图

注:一个Activity构造的时候只能初始化一个Window(PhoneWindow),另外这个PhoneWindow有一个”ViewRoot”,这个”ViewRoot”是一个ViewViewGroup,是最初始的跟视图,然后通过addView方法将View一个个层叠到ViewRoot上,这些层叠的View最终放在Window这个载体上面

分享到:
评论
1 楼 knight_black_bob 2016-10-08  
能不能把你自己的博客整理下分类下,写了这么多 ,都不知道怎么查找自己需要的内容了

相关推荐

    详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    WindowManager mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); WindowManager.LayoutParams params = new WindowManager.LayoutParams( ViewGroup.LayoutParams.WRAP_...

    Android 悬浮view

    WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); ``` 然后,我们需要定义一个布局文件,例如`floating_view.xml`,作为悬浮视图的UI结构。在这个布局文件中,你可以包含...

    Android-Android开发使用PupopWindow在指定View的上下左右动态显示菜单列表

    PopupWindow popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); ``` 接着,为了在指定的View上方或下方显示PopupWindow,我们需要计算出...

    android_悬浮

    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); windowManager.addView(LayoutInflater.from(this).inflate(R.layout.float_ms, null), params); ``` 这里,`TYPE_PHONE`或`TYPE...

    awt.zip_android_android 游戏_安卓游戏_小游戏

    然而,在Android开发中,我们通常不直接使用AWT,因为Android有自己的视图系统,如View和 ViewGroup,它们更适应移动设备的特性和交互方式。AWT在Android中的存在可能意味着这个小游戏可能是移植自Java桌面应用,...

    Android_GWES

    在Android中,所有的UI元素都可以被视为View或ViewGroup的实例。例如,一个Activity的主界面通常由一个名为DecorView的ViewGroup构成,而DecorView本身继承自FrameLayout,进一步继承自ViewGroup。 ##### 2.2 UI ...

    Android的Window类

    ### Android的Window类详解 #### 一、概述 在Android系统中,`Window`类扮演着极其重要的角色,它是应用程序与用户交互的主要界面之一。本文将深入探讨Android中的`Window`类及其相关特性,帮助开发者更好地理解其...

    Android悬浮窗demo

    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.addView(view, params); ``` 为了实现悬浮窗的移动和拖拽功能,你需要监听触摸事件,更新`LayoutParams`的坐标,并调用`...

    android 飘窗

    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); // 设置布局参数 windowManager.addView(your...

    WindowView-一款强大的Android源码.rar

    WindowView是一款专为Android平台设计的强大视图库,它的源码为我们提供了深入理解Android UI机制、自定义View以及动画效果实现的机会。通过分析这个开源项目,开发者可以学习到许多关于Android开发的重要知识点。 ...

    Android之实现浮动窗口播放器_悬浮窗.zip

    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); LayoutInflater inflater = LayoutInflater.from(this); View floatingView = inflater.inflate(R.layout.float_view, null); ...

    Android事件分发机制(上) ViewGroup的事件分发

    ViewGroup作为View的容器,它不仅包含多个子View,还负责管理这些子View的事件处理。事件分发涉及到MotionEvent的生命周期以及ViewGroup如何决定事件传递的方向。 MotionEvent是Android中表示触控事件的对象,包含...

    Android 实现在所有应用上显示View

    通过`Context.getSystemService(Context.WINDOW_SERVICE)`获取`WindowManager`实例。 4. **设置LayoutParams**:为你的View创建一个`WindowManager.LayoutParams`对象。设置其类型为`TYPE_SYSTEM_ALERT`,这允许你...

    android之悬浮窗实现_android源码.zip

    floatingView = inflater.inflate(R.layout.floating_window_layout, null); // 配置悬浮窗参数 WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams( ViewGroup.LayoutParams.WRAP_...

    Android中Window添加View的底层原理

    在Android系统中,Window并非直接与用户界面的View元素等价,而是作为承载View的容器。本文将深入探讨Android中Window添加View的底层原理,包括Window和WindowManager的概念、交互方式以及添加View的关键步骤。 ...

    安卓换肤主题更换夜间模式相关-Android夜间模式实现通过在window上加一层半透明的View.rar

    本压缩包提供的资料是关于如何在Android系统中实现夜间模式的一种方法,即通过在窗口(Window)上添加一层半透明的View来达到效果。下面将详细阐述这一实现方式。 首先,理解Android窗口(Window)的概念至关重要。...

    android悬浮控件例子

    View floatView = getLayoutInflater().inflate(R.layout.float_window_layout, null); windowManager.addView(floatView, layoutParams); ``` 对于悬浮窗的交互,比如移动和关闭,可以通过监听Button的点击事件来...

    android_framework_base:GreenOS 框架基础

    5. **UI框架**:包括View和 ViewGroup体系,它们构成了Android界面的基本元素。`View`类提供了基本的绘图和事件处理能力,`ViewGroup`则负责布局管理。 6. **Content Provider**:数据共享机制,允许不同应用之间...

    Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果 源码程序

    WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); LayoutParams layoutParams = new WindowManager.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup....

Global site tag (gtag.js) - Google Analytics