转载请注明出处,点击此处 查看更多精彩内容。
一、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到容器View
fragmentTransaction.add(容器View的id, Fragment实例);
// 添加Fragment到容器View,并给Fragment指定tag
fragmentTransaction.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中的Fragment
fragmentTransaction.replace(容器View的id, Fragment实例);
// 替换容器View中的Fragment,并给新的Fragment指定tag
fragmentTransaction.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);