Android组件--Fragment(一)之 基础知识

Fragment的内容很多。本章介绍Fragment的基础知识,包括:生命周期,以及如何使用Fragment。

目录
1. Fragment生命周期图
2. Fragment创建方式
3. Google示例说明

Fragment生命周期图

Fragment的生命周期图如下:

说明:总的来说,Fragment和Activity的生命周期类似。需要注意的是,它相比于Activity,多了onAttach(), onDetch(), onCreateView()和onDestroyView()这几个回调函数;但是,却少了onRestart()。
点击查看:Fragment生命周期测试源码"

Fragment创建方式

Fragment有两种使用方式:静态方式 和 动态方式。

1. 静态方式

第一步:先定义一个Fragment子类。

public class ExampleFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) {
        return inflater.inflate(R.layout.example_fragment, container, false);
    }   
}

说明:ExampleFragment是Fragment的子类,它的布局定义是example_fragment.xml文件。

第二步:定义Fragment子类对应的布局文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <EditText android:id="@+id/edit_message"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:hint="@string/edit_message" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button_send"
        android:onClick="sendMessage" />

</LinearLayout>

说明:上面是example_fragment.xml的内容。

第三步:在需要用到该Fragment的Activity对应的布局中使用该Fragment。

下面是引用Fragment的Activity的代码:

public class FragmentLayoutTest extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);  
    } 
}

下面是main.xml的内容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/fragment_intro"
        />

   <fragment android:name="com.skw.fragmentlayouttest.ExampleFragment"
        android:id="@+id/frag_example"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

说明:在该布局文件中通过调用了先前自定义的ExampleFragment。

点击查看:静态方式的完整源码

2. 动态方式

重复"上面的第一步和第二步",实现一个Fragment子类。

第三步:在需要用到该Fragment的Activity对应的布局中使用定义一个FrameLayout。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/fragment_intro"
        />

    <FrameLayout
        android:id="@+id/frag_example"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

第四步:在Activity中将Fragment填充到FrameLayout中。

public class FragmentLayoutTest extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 获取FragmentManager
        FragmentManager fragmentManager = getFragmentManager();
        // 获取FragmentTransaction        
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        // 获取ExampleFragment
        ExampleFragment fragment = new ExampleFragment();
        // 将fragment添加到容器frag_example中
        fragmentTransaction.add(R.id.frag_example, fragment);
        fragmentTransaction.commit();
    }
}

点击查看:动态方式的完整源码

Google示例说明

点击查看:Google给出的Fragment的源码

Google的官网上以此APK来对Fragment进行了简单介绍,点击查看:Google官网Fragment简介

实际上,Google官网关于Fragment的讲解内容包括三部分:创建Fragment,用Fragment创建灵活的UI,Fragments之间的通信。

  1. 如何创建Fragment,我在上面已经详细介绍过了。
  2. 灵活的创建UI,主要是指采用动态方式创建Fragment,并根据屏幕大小,来选择适当的Fragment对UI进行布局。
  3. Fragment之间的通信。Fragments之间是无法直接通信的,那怎么办呢?Google官网给出的解答是,采用类似于回调函数的机制。Fragment都是通过Acitivty来显示的,不同的Fragment可以通过Activity这个中介来进行通信。具体的做法是在Fragment给出接口定义,然后再在Activity中实现给接口,从而实现不同Fragment之间的通信。
by skywang
Previous     Next