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出现空白页的情况
























0 0
原创粉丝点击