创建一个Fragment
如果要创建一个Fragment,必须创建一个Fragment的子类(或者已经存在的子类)。一个Fragment看起来像一个activity。它包括和activity相似的回调方法,例如 onCreate()
, onStart()
, onPause()
, and onStop()。
实时上,如果你要使用fragment转化一个已经存在的Android应用,你也许只要简单的将activity中回调函数中的代码复制到fragment的回调方法中。
一般情况下,你应该实现至少以下几种方法:
创建fragment的时候系统会调用这个方法。在你的实现中,你可以进行一些初始化工作。
当fragment首次要draw 他自己的用户界面的时候,系统会调用这个方法。这个方法必须返回一个 View,这个veiw也就是fragment的根布局。如果这个fragment不提供UI,你可以返回null。
当用户离开这个fragment的时候,会首先调用这个方法。
一般情况下大多数程序都会实现这三个方法,但是还有几个其他的回调方法,他们用来处理fragment生命周期的各个阶段。
当然,你也可以继承一些Fragment已经存在的子类来代替继承Fragment类:
- 添加一个用户界面
为fragment供一个布局,你必须实现onCreateView() 回调方法,当fragment要显示界面的时候会调用这个方法,然后这个方法必须返回一个View对象。
如果你的fragment是 ListFragment 的子类,onCreatView()默认情况下会返回一个
ListView
类的对象,所以,你没有必要去实现它。
例子:
public static class ExampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.example_fragment, container, false);
}
}
这有有一点需要说明的,那就是inflate(int resource, ViewGroup root, boolean attachToRoot)方法的三个参数。
- 第一个参数代表的是一个资源的id,也就是代表你即将inflate的资源文件。
- 第二个参数是你需要将inflate的视图添加到的Viewgroup,在上面的例子中是把R.layout.example_fragment inflate后代表的视图添加到container中。
- 第三个参数表示是否把inflate的视图添加到container中,如果是false,代表不添加到container中,只是返回一个视图和视图的layoutparams,如果是true,代表会添加到container中去。
- 添加一个Fragment到activity中
一般情况下,一个fragment为一个activity贡献了一部风UI,他会嵌入一个activity中作为其中的一部分。有两种方法江一个fragment添加到一个activity中:
在activity的layout文件中声明fragment
在这种情况下,你可以为这个fragment指定布局属性,就像一个普通的view一样。例如:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="com.example.news.ArticleListFragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.news.ArticleReaderFragment" android:id="@+id/viewer" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>
通过代码方式添加fragment
在你activity运行的任何时间内,你可以添加fragments到你的activity的布局中,你只需要指定一个 ViewGroup
用来放置fragment。
为了在activity中进行事务管理(例如 add,remove,or replace 一个fragment),你必须使用FragmentTransaction.你可以从activity中获取一个 FragmentTransaction
的实例,例如:
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
然后你就可以使用 add()
方法,添加一个fragment到一个activity布局中。
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
- 添加一个没有UI的fragment
上面的例子展示了如何江一个fragment的界面添加到activity的布局中。但是,你也可以使用一个后台的fragment,也就是说他没有界面。
添加一个没有UI的fragment会使用add(Fragment, String) 方法,因为他不是一个界面。所以只能是用tag作为唯一标识。
- 管理fragments
在activity中管理fragments,你需要用到FragmentManager. ,在activity中通过getFragmentManager()来获取它。
通过FragmentManager. 你可以做的事情包括:
- 获取activity中包含的fragments,通过方法
findFragmentById()
或者findFragmentByTag()
- 使用popBackStack (),使Fragmnet出栈操作,类似用户按回退键。
- 注册一个back Stack change事件监听,方法为addOnBackStackChangedListener().
- Fragment事务
在你的activity中,你可以增加、移除、替换fragment。你提交的没一组变换都叫一个事务(transaction),你需要用到 FragmentTransaction
. 你还可以保存每一个事务到一个栈中,这个栈是于activity管理的。你可以从FragmentManager中获取一个 FragmentTransaction
的实例,例如:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每个事务就是你想同时进行的一系列的变化,你可以进行所有你想进行的变化,例如 add()
, remove()
, and replace()
.完成以后你必须调用commit().来提交事务。证明这个事务完成。
在你调用commit()方法前,你可以调用addToBackStack(), 目的是把这个事务添加到一个栈中。这个栈是有activity来管理的,他允许你返回上一个fragmeng的状态,你只要按返回按钮就可以。
- 和activity进行交互
虽然Fragment是不依赖activity而独立实现的,并且可以在多个activity中使用,但是,一个Fragment的对象还是和包含他的actvity有绑定关系的。
特别需要指出的就是,fragment可以通过 getActivity()
来访问activity实例,并很容易执行一些操作,例如查找一个视图在activity的layout中:
View listView = getActivity().findViewById(R.id.list);
同样,你的activity也可以通过FragmentManager 的 findFragmentById()
or findFragmentByTag()
. 来获取一个Fragment对象,例如:
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
actvity向Fragment传递数据:
activity像Fragment传递数据的方法通过在Actvity中创建Bundle数据包,并调用Fragment的setArguments方法即可将数据传递给Fragment,例如:
FragmentB fragmentB = new FragmentB();
Bundle bundle = new Bundle();
bundle.putString("fragmentTest", "the data is passed in by activity");
fragmentB.setArguments(bundle);
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.ln1,fragmentB, "fragmentB");
transaction.commit();
在Fragment中,就可以调用getArguments()获取参数。
Fragment向activity传递参数
在fragement中定义一个回调接口,再让包含Fragment的activity实现该接口,这样Fragment即可以调用该回调方法将数据传递给activity。