Fragment介绍

来源:互联网 发布:金融学实训软件 编辑:程序博客网 时间:2024/06/04 19:05

一、Fragment简介

Fragment为大量不同型号、尺寸、分辨率的设备提供了一种统一的UI优化方案。
Fragment允许将Activity拆分成多个完全独立封装的可重用的组件,每个组件有它自己的生命周期。
每个Fragment都是独立的模块,并与它绑定的Activity紧密联系在一起。多个Activity可以共用一个Fragment。
Fragment展现了良好的适应性和动态构建UI的能力,可以在一个正在显示的Activity中添加、删除或替换Fragment。

二、创建Fragment

可以通过集成Fragment类来创建一个Fragment,大多数情况下需要为Fragment分配一个UI,也可以为Activity创建一个没有UI但提供后台行为的Fragment。如果Fragment需要UI,可以重新OnCreateView方法来填充并返回所需要的View。
代码示例:

import android.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class MyFragment extends Fragment {    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,            Bundle savedInstanceState) {        // 创建或者填充Fragment的UI,并且返回它。        // 如果这个Fragment没有UI则返回null        return inflater.inflate(R.layout.my_fragment, container, false);    }}  

三、FragmentManager介绍

每个Activity都包含一个FragmentManager来管理它所包含的Fragment。可以通过使用getFragmentManager方法来访问FragmentManager:

FragMentManager fragmentManager = getFragMentManager();

FragmentManager提供了很多方法来访问当前添加到Activity上的Fragment、通过执行FragmentManager来添加、删除和替换Fragment。

四、向Activity中添加Fragment

想要把一个Fragment添加到一个Activity钟,最简单的方法是在Activity布局中使用fragment标签来包含它,如下所示:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:orientation="vertical" >    <fragment         android:name="包名.Fragment类名"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/my_fragment"/></LinearLayout>

一旦一个Fragment被填充后,它就成为一个ViewGroup,会在Activity内显示和管理它所包含的UI。
如果想要在运行时通过添加、删除或者替换Fragment的方式修改UI,更好的方法是在布局文件中添加ViewGroup作为Fragment的容器,然后在代码中使用FragmentTransaction来创建相应的Fragment并添加到ViewGroup中。

五、使用FragmentTransaction

在程序运行时,FragmentTransaction可以用来在一个Activity内添加、删除或替换Fragment。它同样也支持显示过渡动画的规范以及是否在back栈中包含Transaction。
一个新的FragmentTransaction是通过使用Activity的FragmentManager中的beginTransaction方法创建的。在设置显示动画之前,可以根据要求使用add、remove、和replace方法来修改布局,并设置恰当的back栈行为。当准备执行改变时,调用commit方法将事务添加到UI队列。

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();// 添加、删除或者替换Fragment// 指定动画// 如果需要的话,添加到back栈中fragmentTransaction.commit();  

调用 commit()后,事务并不会马上执行。它会在 activity 的 UI 线程(其实就是主线程)中等待直到线程 能执行的时候才执行(废话)。如果必要,可以在 UI 线程中调用 fragmentManager.executePendingTransactions()方法来立即执行事务。

六、添加、删除和替换Fragment

添加一个新的UIFragment时,需要指定要添加的Fragment实例和将要放置它的容器View。另外,还可以为这个Fragment指定一个tag标识,后面通过这个标识,可以使用findFragmentByTag方法找到相应的Fragment。

// 添加Fragment到容器ViewfragmentTransaction.add(容器View的id, Fragment实例);// 添加Fragment到容器View,并给Fragment指定tagfragmentTransaction.add(容器View的id, Fragment实例, tag);  

查找Fragment通常可以通过FragmentManager的findFrafmentById或者findFragmentByTag方法来实现:

Fragment fragment_id = fragmentManager.findFragmentById(fragment组件的id);Fragment fragment_tag = fragmentManager.findFragmentByTag(Fragment实例的tag);

想要删除一个Fragment,首先需要找到对这个Fragment的引用,然后把找到的Fragment实例作为参数传给FragmentTransaction的remove方法。

fragmentTransaction.remove(Fragment实例);

除了添加和删除操作外,还可以使用replace方法替换Fragment,指定要替换的Fragment的父容器的id、一个新的Fragment和tag标识。

// 替换容器View中的FragmentfragmentTransaction.replace(容器View的id, Fragment实例);// 替换容器View中的Fragment,并给新的Fragment指定tagfragmentTransaction.replace(容器View的id, Fragment实例, tag);  

注意:在添加、删除和替换操作之后,都需要调用fragmentTransaction.commit();方法提交事务

七、Fragment back栈的管理

假设现在我们有两个Fragment:Fragment01和Fragment02,我们现在从Fragment01的界面跳到Fragment02,然后按Back键,发现程序是直接退出了,而不是返回到Fragment01。如果现在想实现以下功能:从Fragment01的界面跳到Fragment02,然后按Back键,会返回到Fragment01。这个功能该怎么实现呢?这其实就利用到了返回栈的知识。
其实很简单,FragmentTransaction中提供了一个addToBackStack()方法,可以将一个事务添加到返回栈中。

FragmentManager fragmentManager = getFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();// 添加、删除或者替换Fragment// 指定动画// 添加到back栈中,参数用于描述返回栈的状态,一般传null即可fragmentTransaction.addToBackStack(null);fragmentTransaction.commit();  

八、对Fragment设置切换动画

FragmentTransaction类中定义了一些默认的动画,可以对任何FragmentTransaction使用setTransition方法,并传入一个FragmentTransaction.TRANSIT_*常量:

fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);  

也可以通过setCustomAnimations方法对FragmentTransaction设置自定义的动画:

fragmentTransaction.setCustomAnimations(Fragment进入的动画资源id, Fragment退出的动画资源id);  
0 0