赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 手持终端

首页 > 专业技术 > 手持终端 > Android的Fragment框架
Android的Fragment框架

可以把Fragment设计成可以在多个Activity中复用的模块,也可以组合多个Fragment放在一个单独的Activity中来创建一个多界面区域的UI,并可以在多个Activity中重用某一个Fragment。Fragment模块有自身的布局、生命周期,可以单独处理自身的输入,在Activity运行时可以加载或移除Fragment模块。
因为Fragment必须嵌入在Activity中使用,所以Fragment的生命周期和它所在的Activity密切相关。如果Activity处于暂停状态,则其中所有的Fragment都是暂停状态;如果Activity处于stopped状态,则这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么其中的所有Fragment都会被销毁。
但当Activity处于活动状态,此时可以独立控制Fragment的状态,比如添加或者移除Fragment。

1.Fragment的生命周期:

当一个Fragment被创建时,会经历以下状态:onAttach()--onCreate()--onCreateView()-- onActivityCreated()
当这个Fragment对用户可见时,会经历以下状态:onStart()--onResume()
当这个Fragment进入后台时,会经历以下状态:onPause()--onStop()
当这个Fragment被销毁了,或在所的Activity被销毁了,会经历以下状态:onPause()--onStop() --onDestroyView()--onDestroy()--onDetach()
一旦Activity进入Resumed状态(即Running状态),用户就可以自由地添加和删除Fragment了。因此,只有当Activity处于Resumed状态时,Fragment的生命周期才能独立运转,其他时候依赖于Activity的生命周期变化。

2.Fragment使用:

使用Fragment时,需要继承Fragment或者Fragment的子类DialogFragment、ListFragment、PreferenceFragment、WebViewFragment,代码看起来与Activity类似。
⑴使用Support Library:
Support Library是一个提供了API库函数的JAR文件,这样就可以在旧版本的Android上使用一些新版本的API。比如android-support-v4.jar。为了在旧版本系统上使用新版本,需要导入:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
同时需要将上述的包复制到项目的libs目录中,在项目的右键菜单中选择Properties--Java Builder Path--Add External JARs...,添加android-support-v4.jar。
当创建包含Fragment的Activity时,如果用的是Support Library,那么继承的就应是Fragment Activity。其中必须实现3个回调函数:
·onCreate():系统在创建Fragment时调用该方法,用来初始化相关组件,一些在暂停或停止时依然需要保留的内容。
·onCreateView():当第一次绘制Fragment的UI时系统调用该方法,必须返回一个View,如果Fragment不提供UI则返回null。如果继承自ListFragment,则onCreateView()默认的实现会返回一个ListView,不用自己实现。
·onPause():当用户离开Fragment时首先调用该方法,需要提交一些变化,因为用户很可能不再返回。
⑵实现Fragment的UI:
提供Fragment的UI,必须实现onCreateView()方法。假设Fragment的布局设置写在example_fragment.xml中,那么onCreateView()方法写为:
public static class ExampleFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState)[
//Inflate the layout dor this fragment
return inflater.inflate(R.layout.example_fragment,container,false);
}
}
onCreateView()中的container参数代表该Fragment在Activity中的父控件;savedInstanceState提供了上一个实例的数据。
inflate()方法有3个参数,resourceId指明了当前的Fragment对应的资源文件;container是父容器控件;第3个为布尔型参数,表明是否连接该布局和其父控件,因为系统已经插入了这个布局到父控件,设置为true会产生多余的一个ViewGroup。

3.将Fragment加入Activity:

当Fragment被加入Activity中时,会处在对应的ViewGroup中。Fragment有两种加载方式,一种是在Activity的layout中使用标记<fragment>声明,另一种是在代码中加入到指定的ViewGroup。Fragment可以并不是Activity布局中的任何一部分,是一个不可见的部分。
⑴通过布局文件将Fragment加入Activity:
在Activity的布局文件中,将Fragment作为一个子标记加入即可,示例代码:
<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/list" android:layout_weight="1"
android:layout_width="0dp" android:layout_height="match_parent"/>
</LinearLayout>
其中,android:name属性设置为创建的Fragment的完整类名。当创建该Activity布局文件时,系统会实例化每一个Fragment,并且调用它们的onCreateView()方法,来获知相应Fragment的布局,并将返回值插入Fragment标记所在的位置。
有3种方法为Fragment提供Id,android:id属性、android:tag属性,如果上述两种都没有提供,则使用容器view的Id。
⑵提供编程方式将Fragment加入到一个ViewGroup中:
当Activity处于Running状态时,可以在Activity的布局中动态加入Fragment。只需要指定加入该Fragment的父ViewGroup即可。
首先需要一个FragmentTransaction实例:
FragmentManager fragmentManager=getFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
如果导入的包为import android.support.v4.app.FragmentManager;
之后,用add()方法添加Fragment对象:
ExampleFragment fragment=new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container,fragment);
fragmentTransaction.commit();
其中,第1个参数是该Fragment的容器,即父控件组。最后调用commit()方法使得Fragment Transaction实例的改变生效。

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659