false); initView(rootView); } isViewCreated=true;//在onCreateView执行完毕,将isViewCreated...initView(rootView); } isViewCreated=true;//在onCreateView执行完毕,将isViewCreated改为true;...= null && !...false); initView(rootView); } isViewCreated=true;//在onCreateView执行完毕,将isViewCreated...= null && !
方法返回结合后的View,根元素是第二个参数ViewGroup。如果是false的话,第一个参数所指定的layout文件会被填充并作为View返回。这个View的根元素就是layout文件的根元素。...当在Fragment的onCreateView()方法中填充并返回View时,要将attachToRoot设为false。...// 如果root是null,并且attachToRoot是false,那么返回的结果就是temp if (root == null || !...rInflateChildren方法解析所有子元素: 在LayoutInflater#inflate方法中,当解析完根视图以后,会通过rInflateChildren解析当前根视图下的所有子视图 final...View元素添加到他们对应的parent中,通过rInflate解析完成以后,整棵View结构树就构建完成了。
= null override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?...null * 需要添加 返回 [initTitleBar] 方法 */ protected abstract fun getTitleBar(): TitleBar?...这意味着我 们需要向函数传递⼀个 T 类型的实例,并且我们可以在函数内部调⽤该实例的成员。...{ return null } } interface BaseViewImp { /** 返回ViewModel的类*/ fun getModel()...{ return null } } 几个 kotlin 语法我啰嗦几句,var lateinit 只能说是提示编译器,这个变量不要因为没有初始化就给我报错,我会在使用前择期初始化
app会在不同屏幕尺寸时动态选择在同一个Activity中同时显示文章列表和对应选择的文章的详情信息,或者单独的一个列表界面,选择一个文章后打开新Activity来显示文章详情。...标签指定的Fragment在Activity的布局加载中会被实例化,onCreateView()返回的View将替换元素在layout中的位置。...而这个方法在Fragment还未attached或已经detached后 期间均返回null。...在通过FragmentTransaction来执行有关fragment的事务时,可以通过addToBackStack()来添加此次事务的操作到回退栈中,这样以后,用户按下返回键后Activity的Fragment...,布局中同时提供了R.id.detail_container作为ArticleDetailFragment的容器,这样在选择查看某个标题时, 就会在同一个界面使用ArticleDetailFragment
(),该方法返回Fragment的UI布局,需要注意的是inflate()的第三个参数是false,因为在Fragment内部实现中,会把该布局添加到container中,如果设为true,那么就会重复做两次添加...在一次事务中,可以做多个操作,比如同时做add().remove().replace()。 commit()操作是异步的,内部通过mManager.enqueueAction()加入处理队列。...上面的方法中,只有onCreateView()在重写时不用写super方法,其他都需要。...当用户点返回按钮回退事务时,F1会调onCreateView()->onStart()->onResume(),因此在Fragment事务中加不加addToBackStack()会影响Fragment的生命周期...如果要自定义对话框样式,只需要继承DialogFragment,并重写onCreateView(),该方法返回对话框UI。这里我们举个例子,实现进度条样式的圆角对话框。
Fragment2 onPause Fragment2 onStop Fragment2 onDestoryView Fragment2 onDestory 用这种方法切换,Fragment在隐藏时并不会走...onDestoryView,所以显示时也不会走onCreateView,所有View都一直保存在内存中。...看了ApiDemo,发现也是用replace方法,但是,我少了一行: ft.addToBackStack(null); 在replace时加上这行,可以把原来的Fragment放入栈中,走onDestoryView...方法,但不会onDestory,返回时,直接onCreateView,不再onCreate....返回直接调用popBackStack()方法: getFragmentManager().popBackStack(); 转载地址:http://www.pocketdigi.com/20141006
onCreateView() 系统会在片段首次绘制其界面时调用此方法。如要为片段绘制界面,从此方法中返回的 View 必须是片段布局的根视图。如果片段未提供界面,可以返回 null。...如要为片段提供布局,必须实现 onCreateView() 回调方法,Android 系统会在片段需要绘制其布局时调用该方法。此方法的实现所返回的 View 必须是片段布局的根视图。...如要从 onCreateView() 返回布局,可以通过 XML 中定义的布局资源来扩展布局。为帮助您执行此操作,onCreateView() 提供了一个 LayoutInflater 对象。...但请注意,只有在该片段附加到 Activity 时才需调用 getContext()。如果尚未附加该片段,或者其在生命周期结束期间已分离,则 getContext() 返回 null。...界面时调用,返回值为Fragment要绘制布局的根视图,当然也可以返回null。
= null) { view = mFactory2.onCreateView(parent, name, context, attrs); }...= null) { view = mPrivateFactory.onCreateView(parent, name, context, attrs);...总结 LayoutInflater有两个加载布局的方法,分别是两个参数和三个参数的,这里有以下几种情况: (1)、如果root为null,无论attachToRoot为true或者false,返回的都是一个不带...(2)、如果root不为null,attachToRoot为true,会返回一个带有LayoutParams的View,并且该View会添加到root布局。...(3)、如果root不为null,attachToRoot为false,也会返回一个带有LayoutParams的View,但不会添加到root布局。
在 Android Studio 中,点击最顶部的 Tools -> Kotlin ,然后选择 Show Kotlin Bytecode,可以在右侧面板中看到对应的字节码,然后点击 Decompile...具体查找流程是这样的:在findCachedViewById()中,会先通过缓存 HashMap 的 get 方法来获取控件, get() 中传入的 key 即控件 ID,由于第一次 get 的值为 null...以上是在 activity 里面直接使用控件 ID,但是在 fragment 里面使用要注意的是,不能在onCreateView方法里用 view 的 ID,而是在 onViewCreated以后使用,...()的,如果是在onCreateView方法里使用控件 ID,这个时候getView()会返回 null,即 var10000为null,这样findCachedViewById()就返回空了。...因此,千万要注意 fragment 里面不能在onCreateView方法里用 view 的 ID。
LayoutInflater的使用中重点关注inflate方法的参数含义: inflate(xmlId, null); 只创建temp的View,然后直接返回temp。...inflate(xmlId, null, false); 只创建temp的View,然后直接返回temp。...inflate(xmlId, null, true); 只创建temp的View,然后直接返回temp。...之后以后引入的,所以我们要根据SDK的版本去选择调用上述方法。...方法的时候调用的AppCompatDelegate.onCreateView的时候第一个参数传递的值就是null。
(String name, Context context, AttributeSet attrs) { View view = null; if (name.equals...= null) return view; return super.onCreateView(name, context, attrs); } } 我们可以发现,只是做了name...(自己理解静态内部类,一般内部类 就是和本来关系比较密切,在其他地方不需要调用,非静态内部类可以调用外部类的属性和方法, 比较方便。...Override这几个方法,而不从别的方法下手,自己以后再做考虑) 后面我们再说明下,是怎么通过AutoLayoutHelper把 传递值 和 计算 联系起来的 ---- AutoRelativeLayout...的接口, 传递 AutoLayoutHelper的实现 返回 AutoLayoutInfo 对象 ---- AutoLayoutInfo类 我们看看 AutoLayoutInfo 类 public
} } 可以看出来在 onCreateView 方法中会判断标签名字如果是 fragment 的话则会调用 mFragments.onCreateView 来创建 View。...= true; return onCreateView(inflater, container, savedInstanceState); } 在最后一行我们再次看到了 onCreateView...方法,这个 onCreateView 就是 Fragment 的一个方法,我们在开发中需要覆写的那个。...Fragment 的 performCreateView() 方法的返回值是一个 View ,这个View 被返回给了 Activity 中的 onCreateView 方法;这样就实现了遇到 fragment...标签特殊处理并返回 view。
不能为 null,并且只能设置一次,设置之后无法修改,当 xml 中每一个元素名字被解析的时候调用。如果 factory 返回一个 View,将被添加到视图层级中。...如果返回 null,factory 的下一个默认方法 onCreateView(View, String, AttributeSet) 将被调用。...代理给 AppCompatDelegate 在 AppCompatDelegate 内部有一个 createView 方法,不要和 Factory 、Factory2 的 onCreateView 混淆...如果是未知类型的 View,将使用正确的 Context 调用 createView,默认返回 null,但一般会被 AppCompatViewInflater 的子类重写。...在检查 android:onClick 之后,view 就被返回了。
,以后如果再重新打开该 Fragment 的话,就不要再重复的去加载数据了。...比如说,我下载完数据就直接需要对 ui 进行操作,将数据展示出来,但有时却报了 ui 控件 null 异常,这是因为 setUserVisibleHint() 有可能在 onCreateView() 创建...Fragment * view 的复用其实就是指保存第一次创建的 view,后面再 onCreateView() 时直接返回第一次创建的 view * * @param isReuse...首次可见时回调,可在这里进行加载数据,保证只在第一次打开Fragment时才会加载数据, * 这样就可以防止每次进入都重复加载数据 * 该方法会在 onFragmentVisibleChange...如果出现切换回来或不相邻的Tab切换时导致空白界面的问题,解决方法:在 onCreateView中复用布局 + ViewPager 的适配器中复写 destroyItem() 方法去掉 super。
也就是说,在 Activity / Fragment / View / Dialog 中,获取LayoutInflater#getContext(),返回的就是 Activity。...为 false,返回 temp if (root == null || !...= null) { view = mFactory.onCreateView(name, context, attrs); } else { view = null...= null) { view = mPrivateFactory.onCreateView(parent, name, context, attrs); } 4....,关于FragmentController#onCreateView(...)内部如何生成 Fragment 以及返回 View 的逻辑,我们在这篇文章里讨论,请关注:《Android | 考点爆满,带你全方位图解
); 复制代码 甚至于我们平常在Activity里面经常写的setContentView(R.layout.xxx);方法的内部也是通过inflate方法实现的。...setFactory2方法,setFactory2是在SDK>=11以后引入的: ?...this.onCreateView((View)null, name, context, attrs); } //'调用方法2' public final View onCreateView(View...我们知道了在onCreateView中,可以看到遍历的所有View的名字及属性参数,也可以在这里把return的值更改做替换。...总结:设置Factory2更像是在系统填充View之前,先跑了一下onCreateView方法,然后我们可以在这个方法里面,在View被填充前,对它进行修改。 ---- ? 3.
,通过inflater.inflate加载布局文件,接着返回其View 在需要加载Fragment的Activity对应布局文件中的name属性设为全限定类名,即包名.fragment 最后在Activity...()方法返回Fragment的UI布局,需要注意的是inflate()的第三个参数是false,因为在Fragment内部实现中,会把该布局添加到container中,如果设为true,那么就会重复做两次添加...对应的同步方法为commitNow(),commit()内部会有checkStateLoss()操作,如果开发人员使用不当(比如commit()操作在onSaveInstanceState()之后),可能会抛出异常...(getActivity()); textView.setText("上上下下的享受");//是电梯,别误会 4.2 传递数据给Activity 步骤流程: 在Fragment中定义一个内部回调接口...首先获取自己控件的引用 可以在onCreateView()中获取 public View onCreateView(LayoutInflater inflater, ViewGroup container
是来帮助做异步加载 layout 的,inflate(int, ViewGroup, OnInflateFinishedListener) 方法运行结束之后 OnInflateFinishedListener 会在主线程回调返回...简单的说我们知道默认情况下 setContentView 函数是在 UI 线程执行的,其中有一系列的耗时动作:Xml的解析、View的反射创建等过程同样是在UI线程执行的,AsyncLayoutInflater...", "android.app." }; @Override protected View onCreateView(String...,这个类我们会在下面重点分析。...; 此处提一个问题:runInner 运行于循环中,会一直在执行吗?
圆形的旋转加载图标只有一个,所以,如果当前Fragment正处于加载状态,在离开该Fragment时需要隐藏加载动画,因为另一个Fragment并不一定处于加载状态,当返回Fragment时,如果还是处于加载状态...懒加载 懒加载意思也就是当需要的时候才会去加载 那么,为什么Fragment需要懒加载呢,一般我们都会在onCreate()或者onCreateView()里去启动一些数据加载操作,比如从本地加载或者从服务器加载...,不会报null异常 ?...另外,因为ViewPager缓存机制,所以题主进行了view的复用,防止onCreateView()重复的创建view,其实也就是将view设置为成员变量,创建view时先判断是否为null。...()里返回的view,修饰为protected,所以子类继承该类时,在onCreateView里必须对该变量进行初始化 */ protected View rootView;
领取专属 10元无门槛券
手把手带您无忧上云