Android Fragment 基本介绍和使用

 

本文将讲解一下Fragment的控制,主要是切换View和页面替换等操作。还有就是如何获取Fragment的管理对象,以及与Activity的通信方式。

 

Fragment

 

Android是在Android3.0 (API level 11)开始引入Fragment的。Fragment中文意思:碎片、片段。其目的是为了解决不同屏幕分辩率的动态和灵活UI设计。fragments 的设计不需要你来亲自管理view hierarchy 的复杂变化,通过将Activity 的布局分散到frament中,可以在运行时修改activity 的外观,并且由activity 管理的back stack 中保存些变化。

可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块。

可以把Fragment设计成可以在多个Activity中复用的模块。

当开发的应用程序有众多的分辨率要去适应(平板电脑和手机),可以利用Fragment实现灵活的布局,让你在不同的屏幕上动态管理UI,改善用户体验。例如:通讯应用程序(QQ),用户列表可以在左边,消息窗口在右边的设计。而在手机屏幕用户列表填充屏幕当点击某一用户时,则弹出对话窗口的设计,如下图:

 

Fragment的生命周期

 

Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。

如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。

但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。

当这样进行fragment transaction(转换)的时候,可以把fragment放入Activity的backstack中,这样用户就可以进行返回操作。



Fragment的使用相关

 

使用Fragment时,需要继承Fragment或者Fragment的子类(DialogFragment, ListFragment,PreferenceFragment, WebViewFragment),所以Fragment的代码看起来和Activity的类似。

 

使用支持库

如果您的应用使用在3.0以下、1.6及以上的版本,需要使用支持库来构建。

使用支持库的步骤:

1、使用SDK下的SDKManager工具下载Android Support Package


2、在您的Android工程的顶级目录下创建一个libs目录

3、找到您的SDK下的/extras/android/support/v4/android-support-v4.jar,并且拷贝到您的项目的libs下,然后在项目的Properties中添加:右键单击项目,选Properties,左边选Java Build Path,然后Add External JARs…,添加android-support-v4.jar.


 

 

4、在您的项目的Manifest.xml文件的<manifest>标签下添加:

<uses-sdkandroid:minSdkVersion="4"

android:targetSdkVersion="8"/>

其中targetSdkVersion是您的软件最小支持的版本

5、如果您的项目支持3.0以下的版本,请导入如下的包:android.support.v4.*;

 

在使用Fragment的Activity请继承FragmentActivity而不是Activity。如果您的系统是3.0或以上版本,同样需要导入类似的包,但是可以使用普通的Activity。

 

 

大多数程序必须使用Fragments 必须实现的三个回调函数:

 

onCreate()

系统在创建Fragment的时候调用这个方法,这里应该初始化相关的组件,一些即便是被暂停或者被停止时依然需要保留的东西。

onCreateView()

当第一次绘制Fragment的UI时系统调用这个方法,必须返回一个View,如果Fragment不提供UI也可以返回null。

注意,如果继承自ListFragmentonCreateView()默认的实现会返回一个ListView,所以不用自己实现。

onPause()

当用户离开Fragment时第一个调用这个方法,需要提交一些变化,因为用户很可能不再返回来。

 

 

Fragments 的类别

 

系统内置了三种Fragments,这三种Fragments 分别有不同的应用场景分别为:

 

DialogFragment

对话框式的Fragments,可以将一个fragments 对话框并到activity 管理的fragments back stack 中,允许用户回到一个前曾摒弃fragments.

 

ListFragments

 

类似于ListActivity的效果,并且还提供了ListActivity 类似的onListItemCLick和setListAdapter等功能。

 

PreferenceFragments

 

类似于PreferenceActivity.可以创建类似IPAD的设置界面。

 

创建一个Fragment加入到Activity

Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。可以看做是一个子Activity。

 

创建一个Fragment和创建一个Activity很类似,继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局。

 

public staticclass ExampleFragment extendsFragment

{

   @Override

    public View onCreateView(LayoutInflater inflater, ViewGroupcontainer,

  Bundle savedInstanceState)

    {

       // Inflate the layoutfor this fragment

       return inflater.inflate(R.layout.example_fragment,container,false);

    }

}

 

onCreateView()中container参数代表该Fragment在Activity中的父控件;savedInstanceState提供了上一个实例的数据。

inflate()方法的三个参数:

第一个是resource ID,指明了当前的Fragment对应的资源文件;

第二个参数是父容器控件;

第三个布尔值参数表明是否连接该布局和其父容器控件,在这里的情况设置为false,因为系统已经插入了这个布局到父控件,设置为true将会产生多余的一个View Group。

 

 

当Fragment被加入Activity中时,它会处在对应的View Group中。

Fragment有两种加载方式:

一种是在Activity的layout中使用标签<fragment>声明;

另一种方法是在代码中把它加入到一个指定的ViewGroup中。

另外,Fragment它可以并不是Activity布局中的任何一部分,它可以是一个不可见的部分。

加载方式1:通过Activity的布局文件将Fragment加入Activity

在Activity的布局文件中,将Fragment作为一个子标签加入即可。

<?xmlversion="1.0" encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="horizontal"

   android:layout_width="match_parent"

   android:layout_height="match_parent">

    <fragmentandroid:name="com.example.news.ArticleListFragment"

            android:id="@+id/list"

            android:layout_weight="1"

           android:layout_width="0dp"

            android:layout_height="match_parent"/>

    <fragmentandroid:name="com.example.news.ArticleReaderFragment"

            android:id="@+id/viewer"

            android:layout_weight="2"

           android:layout_width="0dp"

           android:layout_height="match_parent" />

</LinearLayout>

 

其中android:name属性填上你自己创建的fragment的完整类名。

当系统创建这个Activity的布局文件时,系统会实例化每一个fragment,并且调用它们的onCreateView()方法,来获得相应fragment的布局,并将返回值插入fragment标签所在的地方。

  有三种方法为Fragment提供ID:

  android:id属性:唯一的id

  android:tag属性:唯一的字符串

  如果上面两个都没提供,系统使用容器view的ID。

 

 

加载方式2:通过编程的方式将Fragment加入到一个ViewGroup中

FragmentManager提供了对Activity运行时的Fragment的添加、删除、替换的操作。

Activity运行期间你可以添加Fragment而不是在XML布局文件中进行定义。如果你打算在Activity中改变Fragment的生命过程。如果要执行添加、删除、修改的操作,你必须通过FragmentManager的对象获得一个FragmentTransaction对象,通过它的API来执行这些操作。

当Activity处于Running状态下的时候,可以在Activity的布局中动态地加入Fragment,只需要指定加入这个Fragment的父View Group即可。

首先,需要一个FragmentTransaction实例:

FragmentManager fragmentManager = getFragmentManager()
 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

 

(注,如果import android.support.v4.app.FragmentManager;那么使用的是:FragmentManager fragmentManager =getSupportFragmentManager();

 

之后,用add()方法加上Fragment的对象:

ExampleFragment fragment = new ExampleFragment(); 
fragmentTransaction.add(R.id.fragment_container, fragment); 
fragmentTransaction.commit();

其中第一个参数是这个fragment的容器,即父控件组。

最后需要调用commit()方法使得FragmentTransaction实例的改变生效。

必须最后调用 commit()

如果添加多个fragment到同一个容器, 那么添加的顺序决定了它们在view hierarchy中显示的顺序

如果替换或者删除一个Fragment然后让用户可以导航到上一个Fragment,你必须在调用commit()方法之前调用addToBackStack()方法添加到回退栈。如果你把这个Fragment添加到了回退栈,在提交之后这个Fragment是会被Stop而不是Destroyed。如果用户导航到这个Fragment,这个Fragment会被Restart而不是重新创建。如果你没有把它添加到回退栈,则在删除或者替换的时候它将被Destroyed。例子:

 

 

实例

 

写一个类继承自Fragment类,并且写好其布局文件(本例中是两个TextView),在Fragment类的onCreateView()方法中加入该布局。

  之后用两种方法在Activity中加入这个fragment:

  第一种是在Activity的布局文件中加入<fragment>标签;

  第二种是在Activity的代码中使用FragmentTransaction的add()方法加入fragment。

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值