如要为片段提供布局,必须实现 onCreateView() 回调方法,Android 系统会在片段需要绘制其布局时调用该方法。此方法的实现所返回的 View 必须是片段布局的根视图。...创建此 Activity 布局时,系统会将布局中指定的每个片段实例化,并为每个片段调用 onCreateView() 方法,以检索每个片段的布局。...如果没有在执行删除片段的事务时调用 addToBackStack(),则事务提交时该片段会被销毁,用户将无法回退到该片段。...onCreateView() —— 当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。...同时也可以在该回调中将传入的Arguments提取并解析,在这里强烈推荐通过setArguments给Fragment传参数,因为在应用被系统回收时Fragment不会保存相关属性。
例如:新闻应用可以使用一个片段在左侧显示文章列表,使用另一个片段在右侧显示文章—两个片段并排显示在一个 Activity 中,每个片段都具有自己的一套生命周期回调方法,并各自处理自己的用户输入事件。...不过,在手机尺寸的屏幕上,没有足以储存两个片段的空间,因此Activity A 只包括用于显示文章列表的片段,当用户选择文章时,它会启动Activity B,其中包括用于阅读文章的第二个片段。...官方文档说创建Fragment时至少需要实现三个方法:onCreate( ),onCreateView( ),OnPause( ); 不过貌似只写一个onCreateView也是可以的… Fragment...Step 1:定义Fragment的布局 Step 2:自定义一个Fragment类,需要继承Fragment或者他的子类,重写onCreateView()方法 在该方法中调用:inflater.inflate...()方法, * 因为从fragment的生命周期可以知道当Activity的onCreate(Bundle savedInstanceState)中 * 还无法获取fragment的布局的组件
,又称作Activity片段。...如果在创建Fragment时要传入参数,必须要通过setArguments(Bundle bundle)方式添加,而不建议通过为Fragment添加带参数的构造函数,因为通过setArguments()...,完成后调用FragmentTransaction.commit()方法提交修改 transaction.add():往Activity里面添加一个片段 transaction.remove():从...Fragment和Activity完整的生命周期如上图所示 当Fragment在Activity的onCreate()中被添加时 Activity super.onCreate执行完毕 Fragment...如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。
: 从 XML 中膨胀 DialogFragment 布局。...-- Your layout content goes here --> 使用 DialogFragment 要显示这个 DialogFragment,可以在活动或其他片段中调用以下代码...这种方法允许您的 DialogFragment 在显示时全屏,并隐藏状态栏和导航栏。...在创建 Dialog 时,可以使用 Window 类提供的一些标志来隐藏导航栏。...setLayout 方法将对话框设置为全屏。 systemUiVisibility 属性用于隐藏系统导航栏和状态栏。 通过这些设置,当显示 Dialog 时,它将隐藏系统导航栏和状态栏,实现全屏显示。
当在Fragment的onCreateView()方法中填充并返回View时,要将attachToRoot设为false。...原因是及时不需要马上将新填充的View添加进ViewGroup,我们还是需要这个父元素的LayoutParams来在将来添加时决定View的size和position。...当为AlertDialog创建自定义View时,还无法访问父元素: AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(mContext...当我们不负责将layout文件的View添加进ViewGroup时设置attachToRoot参数为false。 不要在View已经被添加进ViewGroup时传入true。...通过createViewFromTag方法解析普通元素 3. 根据root和attachToRoot的状态,决定是否添加当前View对象到父视图中 4.
接下来看看Fragement的生命周期,图片来源官方: 图片 从上而下: 添加Fragment -> onAttach() -> onCreate() -> onCreateView() -> onActivityCreated...onAttach(): 一旦片段与其活动相关联就被调用; onCreate(): 片段被调用创建; onCreateView(): 创建并返回相关的视图结构; onActivityCreated(...,接下来是点击响应的方法 给MainActivity加上View.OnClickListener接口 在生成的onClick()方法中加上导航栏区域的响应 别忘了在initView()中添加监听器 图片...setMain() 方法,来显示打开界面时,显示的初始页面 实现点击底部导航栏来切换响应的fragment,我们在onClick()中添加即可 图片 3.创建Fragment 创建一个Fragment的子类...,继承Fragmennt类,重写onCreateView()方法。
若想给Fragment传递参数,可在Fragment类中定义一个静态方法newInstance,在该方法中通过setArguments函数写入Bundle对象;然后重写方法onCreateView,在该方法中通过...3、动态注册可以在构造Fragment时传入参数,而静态注册无法直接传参。...该事务的对象可从FragmentManager的beginTransaction方法获得,下面是FragmentTransaction的常用方法: add : 添加碎片 replace : 替换碎片...无则添加,有则替换 remove : 移除碎片 addToBackStack : 加入一个回退栈。这是为了在用户按下返回键时,能够回到上一个页面。...onActivityCreated : 在Activity页面创建完毕之后调用,这意味着onCreateView有可能在主页面尚未创建完毕时就完成了,比如说在主页面的onCreate方法中加入Fragment
图片 Fragment加载 静态加载:添加Fragment到Activity布局中,以xml的形式。...第二步,beginTransaction.add(),add()方法,容器视图资源Id。...图片来源官方: 生命周期 onAttach(): 一旦片段与其活动相关联就被调用; onCreate(): 片段被调用创建; onCreateView(): 创建并返回相关的视图结构; onActivityCreated...打开界面:onCreate() -> onCreateView()->onActivityCreated()->onStart()-> onResume() Home:onPause() -> onStop...replace()为FragmentManager的方法。
建议先回顾下之前五篇文章,这个系列的文章从前往后顺序看最佳: 《Android setContentView 源码解析》; 《Android LayoutInflater 源码解析》; 《Android...1、铺垫 各位老司机肯定对 Fragment 的使用都非常熟悉,我们简单回顾下:Fragment 的添加方式有两种:静态添加和动态添加。...就是说 fragment 标签节点也会被 LayoutInflater 解析,只是被解析之后的流程和别的 view 不一样了。...创建 view,这里就会走到 Activity 的onCreateView 方法; 通过 mFragments(也就是 FragmentController)的 onCreateView 方法来创建 View...方法; 调用 FragmentController 的 onCreateView 方法; 调用 FragmentManager 的 onCreateView 方法; 调用 moveToState 方法
= null && attachToRoot) { //将xml解析出来的viewgroup添加在root的根下...LayoutInflater解析视图xml xml视图树解析 递归执行rInflate生产View并添加给父容器 public abstract class LayoutInflater {.../** * 将parser解析器中包含的view结合属性标签attrs生产view添加在parent容器中 * @param parser xml解析器 * @param...解析器中包含的view结合属性标签attrs生产view添加在parent容器中 * @param parent 父容器 * @param name view名称 * @param...这个是在执行LayoutInflater的setFactory方法时抛出的异常。因为mFactorySet=true。。。。这个时候我们发现LayoutInflater的Factory已经被设置过了。
Fragment是一种可以嵌入在Activity当中的UI片段,用来组建Activity界面的局部模块, 也可以说一个Actiivty界面可以由多个Fragment组成。...其行为与Activity很相似, 有自己对应的布局(包含具体的View), 它有自己的生命周期,接收自己的输入事件,并且可以从运行中的activity中添加或移除。...Fragment的生命周期 image.png onCreateView是创建的时候调用,onViewCreated是在onCreateView后被触发的事件,前后关系 就是fragment中的onCreateView...且onStart运行时间位于onViewCreated之后 方法 含义 onAttach方法 Fragment和Activity建立关联的时候调用(获得activity的传递的值) onCreateView...(表示activity执行oncreate方法完成了的时候会调用此方法) onDestroyView方法 Fragment中的布局被移除时调用(表示fragment销毁相关联的UI布局) onDetach
例如:当activity暂停时,它拥有的所有的Fragment们都暂停了,当activity销毁时,它拥有的所有Fragment们都被销毁。...详细解读每个方法的调用场景 onAttach方法 Fragment和Activity建立关联的时候调用(获得activity的传递的值) onCreateView方法 为Fragment创建视图...和Activity解除关联的时候调用(脱离activity) fragment生命周期解析 当一个fragment被创建的时候: onAttach() onCreate() onCreateView...Fragment的使用 由于Fragment作为Activity的一部分,所以Fragment的使用一般是添加到Activity中,一般有两种方法将Fragment添加到Activity中: - 方法...原因是因为Fragment的可扩展性,它能作为一个独立的显示单元添加到activity中。本文仅仅只是为了说明fragment的layout实现方法,实际应用中,可能比这复杂很多。
接下来实现它的回调方法,例如:onCreate()、onCreateView()、onStart()、onResume()、onPause()、onStop()等等。...onCreateView():当Fragment绘制界面组件时会回调该方法。该方法必须返回一个View,该View也就是该Fragment所显示的View。...onAttach():当该Fragment被添加到Activity时被回调。该方法只会被调用一次。 onCreate():创建Fragment时回调,该方法只会被调用一次。...onCreateView():每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View组件。...onResume():恢复Fragment时被回调,在onStart()方法后一定会回调onResume()方法。 onPause():暂停Fragment时被回调。
如:当Activity暂停时,它拥有的所有Fragment们都暂停 2....生命周期解析 先来看官方说明图 详解每个方法的调用场景 onAttach方法 Fragment和Activity建立关联的时候调用(获得activity的传递的值) onCreateView方法...方法 Fragment和Activity解除关联的时候调用(脱离activity) Fragment生命周期解析 当一个fragment被创建的时候: onAttach() onCreate()...具体使用 由于Fragment作为Activity一部分,所以Fragment的使用一般是添加到Activity中 将Fragment添加到Activity中一般有2种方法: 在Activity...的layout.xml布局文件中静态添加 在Activity的.java文件中动态添加 方法1:在Activity的layout.xml布局文件中静态添加 Activity的布局文件 fragment_layout_test.xml
碎片(Fragment)是一种可以嵌入在活动中的UI片段,可以理解成一个迷你活动。...上面这里重写了Fragment的onCreateView()方法,然后在这个方法中通过LayoutInflater的inflate()方法将刚才定义的left_fragment布局动态加载进来。...效果如图,两个碎片平分了活动布局 接下来,在上面的基础上,学习动态添加碎片 碎片的强大之处就在于,可以在程序运行的时候,动态的添加到活动中,根据具体的情况来动态的添加碎片。...在onCreateView()方法中加载了刚刚创建的another_right_fagment布局,这样就创建好了另一个碎片。...首先,给左侧碎片中的按钮注册了一个点击事件,然后调用replaceFragment()方法,动态的添加RightFragment这个碎片,当点击左侧碎片时,又会调用replaceFragment()方法将右侧碎片替换成
,实际上最终调用的就是方法三; 而方法三最终会调用到方法二 Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ; 2、inflate 方法解析...view当中时,这些layout属性会自动生效; 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true; 3、rInflate 方法解析 以上代码中我们还有两个方法没有分析...通过 createViewFromTag 创建出 View 对象; 如果是 ViewGroup,则重复以上步骤; add View 到相应的 parent 中; 4、createViewFromTag 方法解析...= null) { // ② 有mFactory,则调用mFactory的onCreateView方法 view = mFactory.onCreateView...,首先尝试通过 Factory 来创建View; 如果没有 Factory 的话则通过 createView 来创建View; 5、createView 方法解析 备注:以下源码中有三条备注。
Frament也叫碎片,片段。是Google在Android 3.0引入的,主要为了给大屏幕的UI提供支持的。...您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或删除片段(有点像您可以在不同 Activity 中重复使用的...片段必须始终嵌入在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。 4.生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件。...其中大多数程序必须使用Fragments 必须实现的三个回调方法分别为: onCreate 系统创建Fragments 时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity...onCreateView 用于首次绘制用户界面的回调方法,必须返回要创建的Fragments 视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。
解析xml文件内容的代码片段: public View inflate(@LayoutRes int resource, @Nullable ViewGroup...LayoutInflater的实例,然后再调用它的inflate()方法去解析并加载一个布局,从而转换成一个View对象并返回。...但是这些场景都比较少见,因此大多数情况下,我们在使用LayoutInflater的inflate()方法时都是要指定父布局的。...()方法将它添加到mainLayout当中。...观察一下Fragment的相关源码,你会发现它会将我们在onCreateView()方法中返回的View添加到一个Container当中: void addViewToContainer() {
找到对应资源int id fl_about_container 0x7f090283图片从堆栈看全部在系统调用,首先想到先结合异常源码看看:图片从代码片段看是当前Fragment.mContainerId...2个replace操作待处理2、当销毁的3个Fragment执行onCreate和onCreateView完毕后,此时FragmentManager还会调用execPendingActions,也正是因为调用了这个方法导致了...这个方法是立即执行挂起的操作,很显然在阶段1中有2个replace属于挂起操作,所以这个方法会把这2个replace立即执行。...但onCreateView方法执行不了,因为在FragmentStateManager中图片这里在看抛出异常的链路就很清楚了:图片自此整个Crash的调用链路和发生场景都搞清楚了。...,这样在FragmentActivity执行onStart时,FragmentMananger执行execPendingActions就只有AboutFragment的一个replace挂起的操作,这个操作再
attachToRoot(即调用两个参数的方法),情况和(2)中一样 前两种方法是最常用的加载布局的方法,最终都会调用最后一种方法来加载布局: LayoutInflater是通过Pull解析(XmlPullParser...解析器)方式来解析XML布局文件,解析出节点名之后,然后会调用rInflate方法,这个方法里面会遍历这个根布局下的子元素。...最后若root不为null会调用addView方法,将该生成的View添加到root布局中。...createViewFromTag,每次都会递归调用这个方法来创建这个View下的子元素并且添加到根布局中。...xml的节点名来生成一个View对象,如何生成的呢,调用了一个createView方法(onCreateView方法中也会调用createView方法): public final View createView
领取专属 10元无门槛券
手把手带您无忧上云