1. 创建Fragment
如果的你的APP的最低API版本是11或以上,你不必使用Support Library,你可以直接使用API框架里面的Fragment,这节课主要是讲基于Support Library的API,Support Library有一个特殊的包名,有时候与平台版本的API名字有些轻微的不一样。
创建一个fragment,首先需要继承Fragment类,然后在关键的生命周期方法中插入你APP的逻辑,就像activity一样。其中一个区别是当你创建Fragment的时候,你必须重写onCreateView()回调方法来定义你的布局。事实上,这是使Fragment运行起来,唯一一个需要你重写的回调方法。
public class ArticleFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
return inflater.inflate(R.layout.article_view, container, false);
}
}
就像activity一样,当fragment从activity添加或者移除、当activity生命周期发生变化时,fragment应该是实现生命周期回调来管理它的状态。例如,当activity的onPause()被调用时,它里面的所有fragment的onPause()方法也会被触发。
2. 在Activity运行时添加Fragment
1)比起用<fragment>标签在activity的布局文件中定义fragments,就像上节课说的,你也可以在activity运行时动态添加fragment,如果你在打算在activity的生命周期内替换fragment,这是必须的。
2)为了执行fragment的增加或者移除操作,你必须用 FragmentManager 创建一个FragmentTransaction对象, FragmentTransaction提供了用来增加、移除、替换以及其它一些操作的APIs。
3)如果你的activity允许fragments移除或者替换,你应该在activity的onCreate()方法中添加初始化fragment(s).
4)运用fragment(特别是那些你在运行时添加的)的一个很重要的规则就是在布局中你必须有一个容器view,fragment的layout将会放在这个view里面。
在你的activity里面,用Support Library APIs调用 getSupportFragmentManager()方法获取FragmentManager 对象,然后调用 beginTransaction() 方法创建一个FragmentTransaction对象,然后调用add()方法添加一个fragment.
你可以使用同一个 FragmentTransaction进行多次fragment事务。当你完成这些变化操作的时候,必须调用commit()方法。
3. Fragment替换
替换fragment的过程与添加过程类似,只需要将add()方法替换为 replace()方法。
记住当你执行fragment事务的时候,例如移除或者替换,你经常要适当地让用户可以向后导航与"撤销"这次改变。为了让用户向后导航fragment事务,必须在FragmentTransaction提交前调用addToBackStack()方法。
addToBackStack()方法提供了一个可选的String参数为事务指定了一个唯一的名字。这个名字不是必须的,除非你打算用FragmentManager.BackStackEntry APIs来进行一些高级的fragments操作。
4. Fragments之间的交互
定义一个接口
为了让fragment与activity交互,你可以在Fragment 类中定义一个接口,并且在activity中实现这个接口。Fragment在他们生命周期的onAttach()方法中捕获接口的实现,然后调用接口的方法来与Activity交互。
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
}
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
...
}
现在Fragment就可以通过调用OnHeadlineSelectedListener接口实例的mCallback中的onArticleSelected()(也可以是其它方法)方法与activity传递消息。
实现接口
为了接收回调事件,宿主activity必须实现在Fragment中定义的接口。
传消息给Fragment
宿主activity通过findFragmentById()方法来获取fragment的实例,然后直接调用Fragment的public方法来向fragment传递消息。