Android控件之Fragment
来源:互联网 发布:python3防止sql注入 编辑:程序博客网 时间:2024/05/16 11:43
Fragment碎片
Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像Activity一样包含布局。 可以说Fragment是一种轻量级的Activity,引入Fragment后,
一个屏幕下布局更有了定制性和扩展性
Fragment的生命周期
因为Fragment和Activity的生命周期太相似了。只是有几个Activity中没有的新方法,这里需要重点介绍一下:
- onAttach():Fragment和Activity建立关联的时候调用。
- onCreateView():为Fragment加载布局时调用。
- onActivityCreated():当Activity中的onCreate()执行完后调用。
- onDestroyView():Fragment中的布局被移除时调用。
- onDetach():Fragment和Activity解除关联的时候调用。
Fragment为活动状态
Fragment销毁状态
Fragment从返回堆栈中返回到布局文件
添加Fragments
onAttach()
onCreate()
onCreateView()
onActivityCreated()
onStart()
onResume()
Fragments是活动的(正在使用)
用户使用返回功能或 Fragments 被移除 (替换)
Fragments被添加到返回 堆栈中,接着 被移除(替换)
onPause()
onStop
onDestroyView()
onDestroy()
onDetach()
Fragments被销毁
Fragment从返回堆栈中 返回到布局文件
onDestroyView()
|
|
|
onCreateView()
onActivityCreated()
onStart()
onResume()
Fragment与Activity
- 和依赖 Activity 的生命周期是对应的
- 如果动态的切换 Fragment 也会按照创建和销毁的生命周期执行
- 生命周期介绍
- 一般只要处理 onCreateView 就行了
- onAttach 表示 Fragment已经附加到 Activity 上
- onDetach 和 Activity 解除依附状态的时候被调用
- onCreateView 创建 Fragment使用的布局
- onDestroyView 对应于 onCreateView ,可以用来销毁资源
- onActivityCreated Activtiy 的 onCreate 方法已经彻底的执行结束了
Fragment的创建
静态使用
- 创建一个 FirstFragment 继承 Fragment
- 覆写 onCreateView 方法,并返回一个 View 对象
- 在 Activity 的布局文件使用 <fragment> 节点引用 FirstFragment,注意:必须要指定 name 和 id/ tag 属性
- Fragment 的代码
// 1. 继承 Fragmentpublic class FirstFragment extends Fragment {@Override//2. 覆写 onCreateViewpublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// 返回一个view对象return inflater.inflate(R.layout.fragment_first, container, false);}}
- Activity 的布局文件代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" tools:context=".MainActivity" > <fragment android:id="@+id/fragment1" android:name="com.itheima.fragment.FirstFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" /> <fragment android:id="@+id/fragment2" android:name="com.itheima.fragment.SecondFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" /> </LinearLayout>
动态使用
- 创建一个 Fragment 并在 onCreateView 方法返回一个View对象
- 在 Activity 里使用 FragmentTransaction 动态的加载 Fragment
- 注意 :事务最后一定要 commit!!!!!
- Fragment 的代码
public class HengPingFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_hengping, null);}}
- Activity 的代码
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 横竖屏切换时界面会重建。根据当前横竖屏状态使用不同的Fragment// 判断横竖屏。屏幕的 宽 》 高 说明是 横屏WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);int screenW = windowManager.getDefaultDisplay().getWidth();int screenH = windowManager.getDefaultDisplay().getHeight();Fragment useFragment;if (screenW > screenH) {// 横屏useFragment = new HengPingFragment();} else {// 竖屏useFragment = new ShuPingFragment();}// 将要使用的Fragment显示出来// 获取管理器FragmentManager fragmentManager = getFragmentManager();// 开启事务FragmentTransaction transaction = fragmentManager.beginTransaction();// android.R.id.content 是系统提供的应用窗口布局的 id! // 注意:替换的是父窗体的子控件,而不是说将父窗体替换掉transaction.replace(android.R.id.content, useFragment);// 注意:一定 要commit!!!!!!!!!!transaction.commit();}
Fragment的replace和add方法的区别
add 是把一个Fragment添加到一个容器Container中
replace 是先remove相同id的所有Fragment,然后再add当前这个fragment
需要注意:
使用replace()切换的话,Fragment都会重新实例化,重新加载数据,
如何每次加载的数据都是从网络中获取的,这样就会带来性能的问题。
官方说明:replace()方法,只是在上一个Fragment不再使用时才调用。
如果上一个Fragment还需要使用的话,应该使用add()方法切换。
ViewPager和Fragment使用过程中会遇到哪些问题
- 1.适配器的选择
使用ViewPager加载多个Fragment时,我一般选择FragmentPagerAdapter。需要大家注意:FragmentPagerAdapter:该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的场景但是,如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,这时候,我们选择怎么是的适配器呢?应该使用FragmentStatePagerAdapterFragmentStatePagerAdapter:会把已经创建的Fragment进行保存。会保持Fragment的状态通过源码分析发现:FragmentStatePagerAdapter这个类抽象出了一个getItem()方法,用于创建对应的Fragment而FragmentStatePagerAdapter的.instantiateItem()方法实现中,调用了getIitem()方法。调用该instantiateItem()方法时,判断一下要生成的 Fragment 是否已经生成过了,如果生成过了,就使用旧的,旧的将被 Fragment.attach();如果没有,就调用 getItem() 生成一个新的,新的对象将被 FragmentTransation.add()。FragmentStatePagerAdapter会将所有生成的 Fragment 对象通过 FragmentManager 保存起来备用,以后需要该 Fragment 时,都会从 FragmentManager 读取,而不会再次调用 getItem() 方法。
- 2.Fragment数据的缓存
Fragment在初始化View对象,把该对象作为一个成员变量进行保存。再一次初始化Fragment对应的View对象时,判断当前成员变量View对象是否为空。如果为空,创建新的View对象,否则,不在创建。这样就可以做到对Fragemnt进行数据缓存这样做的好处:避免了每次加载Fragment都要重新创建View,加载数据了。提高了性能,以及减少了内存的开销。
- 3.ViewPager预加载
我们知道,系统的ViewPager默认提供预加载机制。但是,根据业务需要,取消掉对应的预加载机制。可以这样做:替换掉系统原生的Viewpager类。将该类中的一个变量mOffscreenPageLimit 设置为0,不进行预加载
- 4.Fragment嵌套Fragment
在Fragment中嵌套Fragment时,一定要使用getChildFragmentManager();否则,会在ViewPager中出现fragment不会加载的情况,即fragment出现空白页的情况
- Android 控件之 Fragment
- Android控件之Fragment
- Android常用控件之碎片Fragment
- android控件之Fragment(碎片)
- Android四大控件之Fragment的使用
- Android kotlin 之 Fragment获取控件
- 常用控件之fragment
- android 控件 fragment 生命周期
- android 控件 fragment baseFragment
- android高级控件-Fragment
- Android常用控件之Fragment仿Android4.0设置界面
- Android常用高级控件之——Fragment
- Android kotlin 之 Fragment怎样直接获取控件
- 常用布局控件之 Fragment
- Android控件Activity、Fragment详解
- android 控件 fragment 简单上手
- android 控件 fragment 简单分析
- android文档之Fragment
- 初始String
- 数据结构——队列之链式存储
- HDU1863 畅通工程
- Android 耗电统计公式
- 一个检验账号密码的页面
- Android控件之Fragment
- 九度OJ题目1176:树查找
- 一个跨平台随机数生成函数
- 循环队列以及full/empty条件的判断
- Intellij IDEA maven编译中文乱码
- java 通过SSL/TLS加密https建立连接
- 3.3(1.委托 2.事件 3.字典)
- adb shell 相关,持续更新
- ubuntu16.04 apt-get 速度慢问题