DecorView在Android应用程序中扮演着重要的角色。...DecorView的作用 DecorView在Android中具有以下关键作用: 容纳内容视图:DecorView是一个ViewGroup,它包含了应用程序的内容视图。...使用DecorView示例 以下是一个示例代码,演示如何在Activity中获取DecorView并更改其背景颜色: // 获取当前Activity的DecorView View decorView =...// 在Activity中创建一个简单的对话框 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle...()方法)时,与之关联的Window也会被销毁。
$LocalWindowManager.addView(Window.java:537) at android.app.Dialog.show(Dialog.java:278) at android.app.AlertDialog...2,什么地方可能照成此问题:当界面销毁后再弹出来;或者界面跳转时我们的view发生改变,dialog依附的context发生变化或者界面未运行了。...:AlertDialog.Builder builder = new AlertDialog.Builder(mContextNew);当然并不是所有静态context都是可以用来创建dialog的,例如...因此如果仍然传入这个静态变量通过一个静态类来弹出对话框就会出现上述找不到window的错误了。...就不会出现找不到其父类window了。
Android里面的AlertDialog一样,通过Builder去构建一个PageLayout。...一个Activity是通过ActivityThread创建出来的,创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView...,Window才是真正的显示视图。...再来看上面的那张图,可以说DecorView是一个界面的真正跟布局,TitleView我们可以通过设置theme样式显示隐藏的,状态布局切换时我们不考虑TitleView,我们只需要考虑ContentView...里写的话,你可以进行改造,也挺简单,目前没提供xml方式,PageLayout的初衷就是模仿AlertDialog方式,随时随地使用状态布局切换 你也可以在BaseActivity和BaseFragment
提到了 activity 的 attach 方法,该方法是在执行Activity启动时在ActivityThread里面的performLaunchActivity调用的。...DecorView是啥? 它直接跟PhoneWindow关联起来的,有了mContentParent,为啥还需要DecorView?...首先AlertDialog是继承Dialog的,mWindow就是Dialog里面初始化的对象,看看是不是PhoneWindow,如果是,那么就可以猜到通过在PhoneWindow添加View就可以在Activity...就像为啥需要使用MVP、MVVM、各种设计模式一样。 2、Activity工作过程是什么样的?...以Activity启动过程为例,Activity启动时是通过Binder向AMS(ActivityManagerService)发请求,通过PIC启动Activity的。 3、Window是什么?
,取值为Builder对象中对应的值 Android源码中Builder模式实现 在Android源码中,最常用到的Builder模式就是AlertDialog.Builder,使用该Builder...在调用Builder的creat函数时会创建AlertDialog,并且将Builder成员变量中P的参数应用到AlertDialog的mAlert对象中,即P.apply(dialog.mAlert)...在调用了builder 的show方法之后。里面在调用具体dialog的show方法显示弹窗。 那么AlertDialog在建造者模式中担任的是指挥者,Bilder就是具体的建造者。...比如我调用了两次setTitle(),在缓存时后一次会覆盖前一次,这样就解决了开发者冲动调用的问题。最后不论是调用Builder的show方法,还是调用调用AlertDialog的show方法。...函数 (2)然后调用AlertDialog的onStart函数 (3)最后将Dialog的DecorView的添加到WindowManager中 那么建造者模式就到这儿了
将alert.setCentView(xx); alertDialog.getWindow();放到alertDialog.show();后边调用。 至于原因,网上有人从源码的角度分析过这个问题。...在Activity中,虽然在setContentView(R.layout.activity_main)之前调用隐藏状态栏的代码,但是一旦Activity跳转,就又出来了, 解决办法是在隐藏状态栏逻辑代码的下面...,加上一个状态栏变化的响应处理,在把它隐藏掉。...View decorView =this.getWindow().getDecorView(); decorView.setSystemUiVisibility(...else if (v instanceof TextView) { ((TextView) v).setTextSize(size); } } } 关于如何使用这个类
这就要从事件分发机制说起了,点击屏幕首先响应的是当前屏幕的顶层View,也就是DecorView,在Activity中也就是Window的根布局。...而我们在第二步Acitivity中就无法获取Dialog的点击事件了,很明显是DecorView就没把事件传过来,难道Dialog的DecorView和Activity的DecorView不是同一个?...因为Dialog创建过程中需要使用Activity的Context,即需要使用Activity的token用来创建window。...因此我们得知,Dialog和Activity但是所处的Window不一样,也就是所在的父View——DecorView也是不一样的,所以在Dialog出现之后,点击屏幕上的按钮,是从Dialog自己的DecorView...onClick(v) } } 2)然后选择hook点,我们之前在《线程与更新UI》文章中说过,Activity的DecorView被完整绘制出来是在onResume之后,所以我们就在这里进行hook
是Android中的窗口,每个Activity和Dialog,Toast分别对应一个具体的Window,Window是一个抽象的概念,每一个Window都对应着一个View和一个ViewRootImpl...showDialog方法,先调用alertDialog.show()方法,再调用alertDialog.hide()方法,hide方法只是将Dialog隐藏,并没有做其他任何操作(没有移除Window)...主线程的Looper何时退出 在App退出时,ActivityThread中的mH(Handler)收到消息后,执行退出。...这样做的原因可能就是为了尽可能保证上层 app 在接收到屏幕刷新信号时,可以在第一时间执行遍历绘制 View 树的工作。...每个Activity的根布局都是DecorView,而DecorView的parent又是ViewRootImpl,所以在子View里执行invalidate()之类的工作,循环找parent,最后都会找到
简介 DecorView的主要角色是作为顶层容器,承载着应用的视图结构。当在应用中使用setContentView方法加载布局时,实际上是将这个布局作为子视图添加到DecorView中。...在Android中,Window和View通过WindowManager服务来管理,WindowManager负责将Window(及其包含的DecorView)放置到屏幕上的正确位置。...在Activity的生命周期中,当调用setContentView方法时,系统就会开始构建视图层次结构,将指定的布局文件加载到当前Activity的Window所关联的DecorView中。...中,会初始化DecorView,但它的触发逻辑是在调用setContentView的时候 初始化DecorView 当Activity启动时,在onCreate方法中通常会调用setContentView...在上面将DecorView添加到WindowManager中时,内部是交由WindowManagerGlobal的addView处理,在该方法中会创建ViewRootImpl对象。
建立联系 Window并不是实际存在的,而是以View的形式存在 WindowManager的三个接口方法也是针对View的 实际使用中无法直接访问Window,必须通过WindowManager View...,一个是 ContentView,而我们平时在 Xml 文件中写的布局正好是展示在 ContentView 中的。...8.DecorView何时才被WindowManager真正添加到Window中?...11、Token的使用场景? Activity创建时,AMS中需要根据Token去找到对应的ActivityRecord。...中——和Activity一致(setContentView) 将DecorView添加到Window中并显示——在Dialog的show方法中,通过WindowManager将DecorView添加到Window
前言 回忆前文:Android自定义View基础:ViewRoot、DecorView & Window的简介,可看出最后1步 = 绘制 ?...() /** * 具体使用:Activity的setContentView() */ @Override public void onCreate(Bundle savedInstanceState..., window); // 2....往DecorView中添加子View // 即文章开头介绍DecorView时提到的布局格式,那只是一个例子,根据主题样式不同,加载不同的布局。...DecorView的显示 在主线程创建时,会调用 handleResumeActivity(),具体如下: /** * 源码分析:主线程创建时,调用的handleResumeActivity()
当mDecor为空时generateDecor()会直接新建一个DecorView对象并将其返回,注意,DecorView本质上就是一个FrameLayout。...在我们写布局的时候,会使用标签来引入某个布局,标签的作用就体现在此,因为父布局已经存在一个ViewGroup了,所以使用时,子布局可以不写最外层的ViewGroup...AppComPatActivity 文章前面已经将Activity的setContentView()介绍完毕了,但是现在使用AndroidStudio开发时,咱们默认的Activity是谁?...这也就是为什么在使用AppCompatActivity时,主题必须设置为AppCompat类型,否则就会抛出异常。...的结尾开始,上回说到,在ActivityThread中调用了handleLaunchActivity()开始真正启动一个活动,今天咱们就来仔细分析下这个方法。
Android 目前的弹窗有如下几种: 普通的应用窗口,如 Dialog 附加与普通窗口的子窗口,如 PopWindow 系统窗口,如 WindowManager type 在 FIRST_SYSTEM_WINDOW...与 LAST_SYSTEM_WINDOW 之间 通过图来简单来了解下 Window 和 View 的关系: Activity 在 attach 阶段创建了 PhoneWindow,并将 AppToken...在 onResume 阶段时,从 PhoneWindow 中获取 WindowManager 来 addView Dialog 有自己的 PhoneWindow,但 Dialog 并没有从 PhoneWindow...方案二:通过 AppToken 来判断 在文章开头的概念中,我们了解到,PopWindow、Dialog 使用的都是 Activity 的 WindowManager,并且,该WindowManager...在初次创建时,构造函数传入的 parentWindow 为 PhoneWindow,这个 parentWindow 很重要,因为在 WindowManagerGlobal 的 addView 方法中,
Window通过WindowManager加载一个DecorView到Window中,并将DecorView交给ViewRoot。...ViewRoot ViewRoot对应ViewRootImp类,它是连接WindowManager和DecorView的纽带,在ActivityThread中,当Activity对象创建完毕后,会将DecorView...2、activity、window、decorView的视图层级关系 看下一张图 上图描述了activity、window、decorView和设置View的视图层级关系 3、setContentView...上面通过主题加载布局,此次使用R.layout.screen_simple,作为例子来操作下面获取contentParent的过程。...4、DecorView的显示 当DecorView的构造流程完成时此时decorView还没有添加到window中。
前言 回忆前文:Android自定义View基础:ViewRoot、DecorView & Window的简介,可看出最后1步 = 绘制 但在绘制前,系统会有一些绘制准备,即前面几个步骤:创建PhoneWindow.../** * 具体使用:Activity的setContentView() */ @Override public void onCreate(Bundle savedInstanceState...往DecorView中添加子View // 即文章开头介绍DecorView时提到的布局格式,那只是一个例子,根据主题样式不同,加载不同的布局。...DecorView的显示 源码分析 在主线程创建时,会调用handleResumeActivity(),DecorView的显示操作从此处开始。...获取Window实例中的Decor对象 r.window = r.activity.getWindow(); View decor = r.window.getDecorView
了解window机制的一个重要原因是:事件分发并不是由Activity驱动的,而是由系统服务驱动viewRootImpl来进行分发 ,甚至可以说,在框架层角度,和Activity没有任何关系。...我们都知道的是,在我们手指触摸屏幕时,即产生了触摸信息。这个触摸信息由屏幕这个硬件产生,被系统底层驱动获取,交给Android的输入系统服务:InputManagerService,也就是IMS。...当viewRootImpl接收到触摸信息时,也正是应用程序进程事件分发的开始。 viewRootImpl是如何分发事件的?...Activity实现了Window.CallBack接口,并在创建布局的时候,把自己设置给了DecorView,因此在Activity的布局界面中,DecorView会把事件分发给Activity进行处理...而如果没有使用DecorView作为模板的窗口,流程就会和上述不一致了,例如PopupWindow: PopupWindow PopupWindow他的根View是 PopupDecorView ,而不是
还有少数人会提到DecorView和ViewRootImp的作用。但是,当我继续追问关于Window的内容时,几乎没有人回答上来。...例如:在attach时创建Window对象、onResume后通知WindowManager添加view。 Window:Window是一个窗口,它是View的容器。...启动Activity时会创建一个Window,显示Dialog时也会创建一Window。因此Activity内部可以有多个Window。...把View树的管理工作封装到Window后,在调用Dialog.show()、Dialog.hide()等Window切换时,Activity只需要负责Window的显示和隐藏即可。...更新视图时,线程检查是在ViewRootImpl的checkThread()中。ViewRootImpl的初始化是在Activity的onResume()方法之后。
在android中我们经常会用AlertDialog来显示对话框。通过这个对话框是显示在屏幕中心的。但在某些程序中,要求对话框可以显 示在不同的位置。例如,屏幕的上方或下方。要实现这种效果。...就需要获得对话框的Window对象,获得这个Window对象有多种方法。最容易的就是直接 通过AlertDialog类的getWindow方法来获得Window对象。...(); 3 Window window = alertDialog.getWindow(); 4 window.setGravity(Gravity.TOP); //window.setGravity...Window window = alertDialog.getWindow(); 5 7....alertDialog.show(); 我们在使用某些应用时会发现当弹出对话框或某些模式窗口时,后面的内容会变得模糊或不清楚。实际上,这些效果也很容易在OPhone中实现。
DialogFragment隐藏导航栏 在 Android 中,使用 DialogFragment 显示对话框时,如果您希望隐藏系统导航栏(如状态栏和导航键),可以通过设置相关的系统 UI 标志来实现。...window?.decorView?....-- Your layout content goes here --> 使用 DialogFragment 要显示这个 DialogFragment,可以在活动或其他片段中调用以下代码...这种方法允许您的 DialogFragment 在显示时全屏,并隐藏状态栏和导航栏。...在创建 Dialog 时,可以使用 Window 类提供的一些标志来隐藏导航栏。
背景 近期在做项目的时候碰到了底部虚拟按键在各个厂商适配的问题,闷逼了一圈,后面搜索一圈,发现即使各大厂商有变动,还是离不开原生本质 正题 我们都知道activity >> window >> decorView...,适配的问题,闷逼了一圈,后面搜索一圈,发现即使各大厂商有变动,还是离不开原生本质 activity 的 decorview 我们都知道activity >> window >> decorView,Window...Window是一个抽象类,实际在Activity中持有的是其子类PhoneWindow。...计算statusBar和NavigationBar的高度 public class DecorUtil { /** * 请勿在dialog中使用 * *...window) { final View decorView = window.getDecorView(); int measuredHeight = decorView.getMeasuredHeight
领取专属 10元无门槛券
手把手带您无忧上云