其实View真正显示的点是在Activity resume的时候,让WMS添加View,其实是这里调用WindowManagerGlobal的addView,这里有个很关键的布局参数params,其实传就是...不设置Window.FEATURE_NO_TITLE 在上面的分析中我们知道,setContentView会进一步调用generateLayout创建根布局,Android系统默认实现了多种样式的根布局应...创建沉浸式全屏Dialog 在全屏Dialog的基础上,我们可以创建沉浸式Dialog,也就是让Dialog的内容区域延展到状态栏下方,由于这里用到了fitsystemwindow,所以要牵扯DecorView...及rootView的设置,在上面的基础上有两点需要处理,一是:内容区域延展上去;二是:状态栏变成透明(不透明你也看不见啊),如何延展内容区域,参考全屏、沉浸式、fitSystemWindow使用及原理分析...(不兼容5.0以下),主题中添加如下属性,设置状态栏颜色透明即可,当然,代码中也可实现。
//这也就是为什么我们在代码中设置Theme或者requesetFeature()的时候必须在setContentView之前的原因....其实在activity中可以调用requestFeature int features = getLocalFeatures(); // System.out.println...这里的mContentParent指的是屏幕显示的内容区,而我们设置的activity_main.xml布局实际上是在一个id为content的FrameLayout中的,这个FrameLayout也就是前面一直提到的...(在onCreate中调用了setContentView,所以把除了decorView之外的所有的view都已经添加进去了。)...handleResumeActivity中把decorView添加进去了handleResumeActivity方法中调用了r.activity.makeVisible()。
不管怎么说,当我们在Activity中调用setContentView的时候,其实内部调用了PhoneWindow的setContentView。...这里先总结下得到的信息: 一个Activity对应一个Window Window只有一个子类:PhoneWindow 在Activity中调用setContentView,其实就是调用Activity里面的...总结 所以整个setContentView内部做了如下事: 在Activity中调用setContentView(实际调用PhoneWindow#setContentView) 新建DecorView实例...设置界面主题(requestFeature) 确定主题界面(layoutResource = R.layout.xxx) 在主题界面抽取内容ViewGroup(mContentParent = findViewById...) 将我们自己创建的布局界面和Android提供的内容mContentParent打包进Scene 通过LayoutInflater解析布局,将布局转化为View 将view添加到mContentParent
缘起 上一篇博文中讲到了几种实现全屏显示Activity内容的方法。然而实际在实现中发现了一些问题,在本篇博文中进行总结下。...因此想到,我们在排查Android运行时异常时是否也可以利用起try-catch这个工具呢?加起来就试试好了: ? 再次在模拟器中运行应用,可以在logcat中输出如下信息: ? ...Android Studio 捕获异常方案二 这种方案是从网上看来的,利用了Therad的一个静态方法,首先定义一个Thread.UncaughtExceptionHandler的实例,然后在程序中设置为未捕获异常的默认处理器...看字面意思是,requestWindowFeature()方法必须在添加视图之前先调用。可是以前也是这么用的啊,也没见出现过这种异常。于是又搜索了一番才在StackOverflow上发现了解决方案。...AppCompatDelegate中的对应方法,即可为旧式Activity添加具备Material Design风格的视图组件。
ViewRoot ViewRoot对应ViewRootImp类,它是连接WindowManager和DecorView的纽带,在ActivityThread中,当Activity对象创建完毕后,会将DecorView...添加到Window中,同时会创建ViewRootImp对象,并将ViewRootImp对象和DecorView建立关联。...ViewRootImpl中调用performTraversals方法,然后便开始测量布局绘画了,界面才得以显示出来,这就是View的绘制流程起点。...2件事: 初始化安装DecorView 将布局内容通过LayoutInflatert添加到decorView的Content中去。...ActivityThread的handleResumeActivity方法中,首先会调用Activity的onResume方法,接着调用Activity的makeVisible()方法。
对于 Activity,在 startActivity 或 finish 后调用 overridePendingTransition(R.anim.activity_in, R.anim.activity_out...) 对于 Fragment: supportFragmentManager.beginTransaction().setCustomAnimations(R.anim.fragment_enter, R.anim.fragment_exit...在两个 Activity 的布局文件中,要协同做动画的 View 要有一个属性 android:transitionName 并将值设为一样的。...() - B 中设置 setReenterTransition() - A 中设置 在 res/transiton 目录创建两个文件,可以定义其时间和插值器 transition_slide.xml true 关于主题 看网上有些文章说必须在主题里设置 android:windowContentTransitions">true 或者代码里在
然后调用generateDecor()给mDecor赋值。在generateDecor()方法中主要是创建了一个DecorView。DecorView它是什么呢?...:id="@android:id/content",所以我们布局中的XML是添加到FrameLayout中了。...注:这个布局在D:\Android\Administrator\AppData\Local\Android\sdk\platforms\android-23中搜索 ?...这个过程可以通过上面代码中: root = new ViewRootImpl(view.getContext(), display); //调用ViewRootImpl#setView添加布局view...图片.png 由此我们可以看到在执行performTraversals()中里面就是View的三大流程了。这部分内容比较多,我们在后续的篇幅中来讲解。 2.
layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar(); } Activity会调用当前...PhoneWindwo对象在Activity中的attach()方法中创建。...isDestroyed()) { cb.onContentChanged(); } } 当我们第一此setContentView()时,mContentParent为空,会调用installDecor...return contentParent; } generateLayout()方法会根据我们Acivity主题样式,选择加载不同的系统布局资源,并将该视图添加到DecorView中去。...(ViewGroup)findViewById(ID_ANDROID_CONTENT); 最后返回contentParent,将setContentView()中的视图加载到mContentParent
在Activity运行过程中,可调用FragmentManager的add()、remove()、replace()方法动态地添加、删除或替换Fragment。...Fragment与Activity通信 为了在Activity中显示Fragment,还必须将Fragment添加到Activity中。.../>元素的android:name属性指定Fragment的实现类。 在Java代码中通过FragmentTransaction对象的add()方法来添加Fragment。...在调用commit()之前,也可以调用addToBackStack()将事务添加到Back栈,该栈由Activity负责管理,这样允许用户按下Back键返回到前一个Fragment状态。...该方法只调用一次。 onDetach():将该Fragment从Activity中删除、替换完成时回调该方法,在onDestroy()方法后一定会回调onDatach()方法,该方法只会被调用一次。
---- 大概可以了解如下内容: a.AppCompatActivity中在onCreate中调用setContentView(R.layout.main)是做什么的,如何装载视图; b.PhoneWindow...是什么,与Window有什么关系; c.DecorView如何被创建的,与Window和其他视图是什么关系; d.在我们调用requestFeature的时候为什么要在setContentView之前?...} 1)在AppCompatActivity定义了setContentView 调用添加视图方法; //设置要显示视图的布局ID或者View @Override public...(subDecor) 我们在创建subDecor时候发现会调用requestWindowFeature(),然后mWindow.getDecorView()创建DecorView添加相应的特征(Feature...Activity中添加视图的流程如下 a.在Activity中调用setContentView();设置我们要显示的视图View或者视图ID Activity @Override protected
添加到屏幕上,只是创建了DecorView,xml添加到DecorView而已。...requestWindowFeature 在 setContentView之后调用,会报错,必须在之前调用才可以?...requestWindowFeature 在 setContentView之后调用,会报错,必须在之前调用才可以?...} ...... } 其实,在PhoneWindow#setContentView方法的最后一行,会设置 mContentParentExplicitlySet 为ture,所以在之后调用...); // 确保ContentView的所有Child全部被移除干净 contentParent.removeAllViews(); // 将画面的内容布局解析并添加到ContentView
会往windowmanage中添加该类的一个实例作为顶层view。...其中这两个步 骤中将view绑定到window是在启动activity时完成的操作,是将mDecor绑定到window。然后再往mDecor中添加各种view。...中的各种feature和flag的style对应的各种含义以及动画style在\android\android\frameworks\base\core\res\res\values\attrs.xml...文件中有注释说明 在menu键的设置中涉及到了版本问题,包括3.0,4.0和5.0分别有对应的不同处理,参考\android\android\frameworks\base\core\java\android...Activity在启动加载布局共有两个操作 创建DecorView的布局:setContentView的流程基本是用来创建DecorView的布局 将布局添加到window窗口:在Activity的启动过程中
定义 Activity界面中的一部分,可理解为模块化的Activity Fragment不能独立存在,必须嵌入到Activity中 Fragment具有自己的生命周期,接收它自己的事件,并可以在Activity...作用 支持动态、灵活的界面设计 Fragment从 Android 3.0后引入 在低版本Android 3.0前使用 Fragment,需要采用android-support-v4.jar兼容包 3....的layout.xml布局文件中静态添加 在Activity的.java文件中动态添加 方法1:在Activity的layout.xml布局文件中静态添加 Activity的布局文件 fragment_layout_test.xml...Android 3.0前,Activity需FragmentActivity(其也继承自Activity),同时需要导入android-support-v4.jar兼容包,这样在Activity中才能嵌入...方法2:在Activity的.java文件中动态添加 步骤1:在Activity的布局文件定义1占位符(FrameLayout) 这样做的好处是:可动态在Activity中添加不同的 Fragment
我们接着看 getWindow().setContentView(layoutResID); 在渲染我们的布局文件前,先调用了installDecor()来初始化mContentParent,之前也说mContentParent...我们来一探究竟,我们看 mContentParent = generateLayout(mDecor)的源码: 小小的发现:从上面的代码我们可以解释很多开发中的技巧,看下面的代码,在加载我们的资源文件前...如下图: 小结:调用setContentView方法,实例化了DecorView, DecorView有两个子布局,一个是加载顶部状态栏的,一个是加载我们的内容布局的,activity添加的xml就是内容布局的一个字元素...作为绘制view的入口,我们来看下requestLayout方法 ViewRootImpl.scheduleTraversals()调用后,系统会发起一个异步消息,然后在异步消息执行过程中调用performTraversals...总结 通过上面内容,我们学到了一些小技巧,如移除状态栏的一些步骤,之前我们可能知道,嗯,是的,要在setContentView前调用requestFeature才可以,通过这次分析,我们之前可能是知道要这样子做才行
可以看到这里不仅初始化mContentParent,而且在之前先调用generateDecor();初始化了一个mDecor,mDecor是DecorView对象,为FrameLayout的子类。...//首先通过WindowStyle中设置的各种属性,对Window进行requestFeature或者setFlags if (a.getBoolean(com.android.internal.R.styleable.Window_windowNoTitle...至于features,除了theme中设置的,我们也可以在Activity的onCreate的setContentView之前进行requestFeature,也解释了,为什么需要在setContentView...前调用requestFeature设置全屏什么的。...最后,我们在Activity中设置的布局,会通过infalter.inflater压入到我们的id为content的FrameLayout中去。
我在上面效果中做了两个操作,点击小的图片,跳转到另一个Activity,然后按了后退键返回上一个Activity,接下来介绍使用方法 首先我们需要开启支持转场动画,有两种方式 1.在Activity的OnCreate...方法中,在setContentView之前调用 getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); 2.在style的AppTheme...name="android:windowSharedElementExitTransition">@transition/enter 2.在代码中设置自定义共享元素转场动画 @Override...4.除了元素共享外,还可以使用内容过渡动画 首先开启支持内容过渡动画,两种方式 1.主题中新增 android:windowContentTransitions"...>true 2.代码调用 getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); 指定过渡动画,两种方式
中的 android:name属性指定了在layout中实例化的Fragment类....在调用commit()之前, 你可能想调用 addToBackStack(),将事务添加到一个fragment事务的backstack....添加变化到 FragmentTransaction的顺序不重要, 除以下例外: 必须最后调用 commit()....如果添加多个fragment到同一个容器, 那么添加的顺序决定了它们在view hierarchy中显示的顺序....例如, 如果一个新的应用在activity中有2个fragment – 一个用来显示文章列表(framgent A), 另一个显示文章内容(fragment B) – 然后 framgent A必须告诉
片段必须始终托管在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。...可复用,页面布局可以使用多个Fragment,不同的控件和内容可以分布在不同的Fragment上。 使用Fragment,可以少用一些Activity。...然后,如要将事务应用到 Activity,必须调用 commit()。 不过,在调用 commit() 之前,可能希望调用 addToBackStack(),以将事务添加到片段事务返回栈。...如果向事务添加多个更改(如又一个 add() 或 remove()),并调用 addToBackStack(),则调用 commit() 前应用的所有更改都将作为单一事务添加到返回栈,并且返回按钮会将它们一并撤消...向 FragmentTransaction 添加更改的顺序无关紧要,不过: 必须最后调用 commit()。 如果要向同一容器添加多个片段,则添加片段的顺序将决定它们在视图层次结构中出现的顺序。
需要注意的是, inflate()的第三个参数需要设置为false,因为在 Fragment内部实现中,会把该布局添加到 container中,如果设为true,那么就会重复做两次添加,则会抛如下异常:...1.静态添加 在需要加载 Fragment的 Activity对应的布局文件中添加 fragment的标签,需指定 name属性,为了限定类名。...需要注意的是,必须给 fragment的标签添加id属性,否则运行会报错。...当我们在 Fragment中继续添加 Fragment,怎么在父 Fragment中获取子 Fragment的管理器?就需要使用 getChildFragmentManager()来获取。...结语 以上就是今天 Fragment的基础内容介绍,内容还是挺多的,需要好好消化下。
适配器有责任从容器中删除这个视图。这是为了确保 在finishUpdate(viewGroup)返回时视图能够被移除。...instantiateItem( ): ①将给定位置的view添加到ViewGroup(容器)中,创建并显示出来 ②返回一个代表新增页面的Object(key),通常都是直接返回view本身就可以了,...- android.widget.RadioGroup RadioGroup提供的只是RadioButton单选按钮的容器,我们可以在该容器中添加多个RadioButton方可使用,要设置单选按钮的内容...按钮组件的使用类似,区别在于定义的RadioButton组件必须放在RadioGroup组件中。...listener)注册一个当子内容添加到该视图或者从该视图中移除时所要调用的回调函数 listener 当层次结构发生改变时所要调用的回调函数 ---- 三.使用效果 ?
领取专属 10元无门槛券
手把手带您无忧上云