- 其中大多数程序必须使用Fragments 必须实现的三个回调方法分别为:
- onCreate
- 系统创建Fragments 时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity 中的onCreate相当。
- onCreateView
- 用于首次绘制用户界面的回调方法,必须返回要创建的Fragments 视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。
- onPause
- 当用户离开这个Fragments 的时候调用,这时你要提交任何应该持久的变化,因为用户可能不会回来。
- 系统内置了三种Fragments ,这三种Fragments 分别有不同的应用场景分别为:
- DialogFragment
- 对话框式的Fragments,可以将一个fragments 对话框并到activity 管理的fragments back stack 中,允许用户回到一个前曾摒弃fragments.
- ListFragments
- 类似于ListActivity 的效果,并且还提供了ListActivity 类似的onListItemCLick和setListAdapter等功能。
- PreferenceFragments
- 类似于PreferenceActivity .可以创建类似IPAD的设置界面。
可以分为下面的几部分:
- 使用支持库
- 创建一个Fragment
- 创建一个动态UI
- 多个Fragment之间的通信
1、使用支持库
如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容。
如果您的应用使用在3.0以下、1.6及以上的版本,需要使用支持库来构建。android-support-v4.jar
2、创建一个Fragment
Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。可以看做是一个子Activity。
创建一个Fragment
创建一个Fragment和创建一个Activity很类似,继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局
- public class Fragment1 extends Fragment{
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreateView(inflater, container, savedInstanceState);
- return inflater.inflate(R.layout.fragment, container,false);
- }
- }
Fragment的生命周期方法依赖于Activity的生命周期,例如一个Activity的onPause()的生命周期方法被调用的时候这个Activity中的所有的Fragment的onPause()方法也将被调用。
使用XML添加Fragment到Activity
尽管Fragment可以被多个Activity重用,但是您也必须把Fragment关联到一个FragmentActivity上。可以使用XML布局文件的方式来实现这种关联。
上面的所说的FragmentActivity适用在API在3.0以下的版本,3.0及以上的版本可以使用普通的Activity。
fragment.xml
- xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <TextView
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:text="Fragment" />
- LinearLayout>
activity_main.xml
- xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <fragment
- android:id="@+id/fragment1"
- android:name="com.example.demo.Fragment.Fragment1"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" >
- fragment>
- <fragment
- android:id="@+id/fragment2"
- android:name="com.example.demo.Fragment.Fragment1"
- android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" >
- fragment>
- LinearLayout>
MainActivity.java
- //3.0以下必须使用FragmentActivity
- public class MainActivity extends FragmentActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- }
Fragment1.java
- public class Fragment1 extends Fragment{
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreateView(inflater, container, savedInstanceState);
- return inflater.inflate(R.layout.fragment, container,false);
- }
- }
上面就是第一个例子的代码 可运行在3.0以下的系统上
当您添加一个片段一个活动布局定义的布局XML文件中的片段,你不能删除在运行时的片段。如果您打算在用户交互和交换片段,你必须添加的活性片段的活动时第一次启动。
3、构建一个灵活的UI
FragmentManager提供了对Activity运行时的Fragment的添加、删除、替换的操作。
在Activity运行期间你可以添加Fragment而不是在XML布局文件中进行定义。如果你打算在Activity中改变Fragment的生命过程。
如果要执行添加、删除、修改的操作,你必须通过FragmentManager的对象获得一个FragmentTransaction对象,通过它的API来执行这些操作。
添加一个Fragment到一个Activity,必须把这个Fragment添加到一个容器视图中。
在Activity中你可以通过getFragmentManager()来获得Fragment对象,然后通过FragmentManager对象的beginFragmentTransaction()方法来获得FragmentTransaction对象。通过它的add()方法来添加一个Fragment到当前的Activity中。
activity_main.xml
- xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/fragment_container"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- LinearLayout>
一个FragmentTransaction对象可以执行多个增删修的方法,如果你想把这些修改提交到Activity上,必须在最后调用一下这个对象的commit()方法。
- public class MainActivity extends FragmentActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Fragment1 fragment1 = new Fragment1();
- //3.0之前需要getSupportFragmentManager()
- //3.0之后只需getFragmentManager()
- getSupportFragmentManager().beginTransaction()
- .add(R.id.fragment_container, fragment1).commit();
- }
- }
如果替换或者删除一个Fragment然后让用户可以导航到上一个Fragment,你必须在调用commit()方法之前调用addToBackStack()方法添加到回退栈。如果你把这个Fragment添加到了回退栈,在提交之后这个Fragment是会被Stop而不是Destroyed。如果用户导航到这个Fragment,这个Fragment会被Restart而不是重新创建。如果你没有把它添加到回退栈,则在删除或者替换的时候它将被Destroyed。
- public class MainActivity extends FragmentActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Fragment1 fragment1 = new Fragment1();
- // 3.0之前需要getSupportFragmentManager()
- // 3.0之后只需getFragmentManager()
- FragmentTransaction transaction = getSupportFragmentManager()
- .beginTransaction();
- transaction.replace(R.id.fragment_container, fragment1);
- transaction.addToBackStack(null);
- transaction.commit();
- }
- }
4、与其他Fragment的交互
两个单独的Fragment之间是不应该进行通信的。应该使用他们所存在的Activity作为沟通的纽带。
为了实现两个Fragment的交互,您可以在Fragment中定义一个接口,然后再这个接口中定义一个方法,在Fragment的onAttach()方法中调用这个接口中的方法。然后让Activity实现这个方法来完成Activity和Fragment之间的通信。
- public class MainActivity extends FragmentActivity implements Fragment1.Testinterface{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- Fragment1 fragment1 = new Fragment1();
- // 3.0之前需要getSupportFragmentManager()
- // 3.0之后只需getFragmentManager()
- FragmentTransaction transaction = getSupportFragmentManager()
- .beginTransaction();
- transaction.replace(R.id.fragment_container, fragment1);
- transaction.addToBackStack(null);
- transaction.commit();
- }
- @Override
- public void Test(String msg) {
- // TODO Auto-generated method stub
- Log.e("----", msg);
- }
- }
- package com.example.demo.Fragment;
- import com.example.demo.R;
- import android.app.Activity;
- import android.os.Bundle;
- import android.support.v4.app.Fragment;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- public class Fragment1 extends Fragment{
- Testinterface testinterface;
- public interface Testinterface{
- public void Test(String msg);
- }
- @Override
- public void onAttach(Activity activity) {
- // TODO Auto-generated method stub
- super.onAttach(activity);
- try {
- testinterface = (Testinterface)activity;
- } catch (Exception e) {
- // TODO: handle exception
- System.err.println(e.toString());
- }
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreateView(inflater, container, savedInstanceState);
- testinterface.Test("测试");
- return inflater.inflate(R.layout.fragment, container,false);
- }
- }