分享

Fragment的使用

 昵称11482448 2013-04-07


生命周期:
135122_7ipQ_245900.png
调用的顺序是onAttach-->onCreate-->...-->onResume 当切换到另一个fragment的时候,会调用onPause-->onStop-->onDestroyView 切换回来时,onCreateView-->onActivityCreated-->onStart-->onResume 也就是说onAttach 和onCreate只调用了一次。所以在进行数据初始化的时候应该把工作放到这两个方法中进行。刚刚的调用过程也正好反映了图中的那条折线----The fragment returns to the layout from the back stack.



那么我们根据这图从上往下:



1.onAttach() 当Fragment附加到父窗口Activity上时。(成为Activity的一部分)



@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// 这个方法你可以获取到父Activity的引用。



}



2.onCreate 这个方法一般做一些Fragment的初始化操作



@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化Fragment



}
3.onCreateView 一旦Fragment已经创建,为了去给Fragment创建它自己的UI,这个方法就是意义所在。



@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {



// 创建或者解析加载一个视图,然后返回作为Fragment的UI

// 如果这个Fragment没有UI,那么返回NULL

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



}



4.onActivityCreated 当父Activity和当前的Fragment的UI都完整创建完的时候被调用



@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);



// 完成Fragment的初始化,不对前面不是已经初始化好了么?



//这个方法主要是初始化那些你需要你的父Activity或者Fragment的UI已经被完整初始化才能初始化的元素。



//具体你看图中的位置你能看出点端倪来。比如UI的元素没被解析反射进来,你还想用? 想得美,等它初始化完,你再用。
}



5.onStart 、onResume 、onPause这些看看就懂不解释了



6.别忘了Fragment也是有onSaveInstance的



@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
//这个Bundle会被传入到onCreate、onCreateView
super.onSaveInstanceState(savedInstanceState);
}



7.onDestoryView 当你的Fragment的UI被分离的时候



@Override
public void onDestroyView() {
//清除所有跟视图相关的资源

super.onDestroyView();
}



8.onDestory 生命周期的末尾了。。。



@Override
public void onDestroy(){
//清除所有资源包括要结束的线程,关闭数据库连接等等。
super.onDestroy();
}



9.onDetach 当你的Fragment从父activity身上分离的时候



@Override
public void onDetach() {
super.onDetach();
}



使用可以分为下面的几部分:
使用支持库
创建一个Fragment
创建一个动态UI
多个Fragment之间的通信



1、使用支持库



如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容。
如果您的应用使用在3.0以下、1.6及以上的版本,需要使用支持库来构建。
使用支持库的步骤:
使用SDK下的SDK Manager工具下载Android Support Package
2012082809164768.png
2. 在您的Android工程的顶级目录下创建一个libs目录
3. 找到您的SDK下的/extras/android/support/v4/android-support-v4.jar,并且拷贝到您的项目的libs下,选中这个jar包 → 右键 → Build Path → Add to Build Path
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。
2、创建一个Fragment



Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。可以看做是一个子Activity。
创建一个Fragment
创建一个Fragment和创建一个Activity很类似,继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局。例子:



2012082809200966.png



Fragment的生命周期方法依赖于Activity的生命周期,例如一个Activity的onPause()的生命周期方法被调用的时候这个Activity中的所有的Fragment的onPause()方法也将被调用。



更多的内容请参照类Fragment。
使用XML添加Fragment到Activity
尽管Fragment可以被多个Activity重用,但是您也必须把Fragment关联到一个FragmentActivity上。可以使用XML布局文件的方式来实现这种关联。
说明:上面的所说的FragmentActivity适用在API在3.0以下的版本,3.0及以上的版本可以使用普通的Activity。
例子:



2012082809205379.png



上面使用fragment标签,android:name=””指定一个添加到xml中的Fragment。对于创建不同的屏幕尺寸布局的更多信息,请阅读支持不同的屏幕尺寸。



2012082809212926.png



当您添加一个片段一个活动布局定义的布局XML文件中的片段,你不能删除在运行时的片段。如果您打算在用户交互和交换片段,你必须添加的活性片段的活动时第一次启动。



3、构建一个灵活的UI



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



在Activity运行期间你可以添加Fragment而不是在XML布局文件中进行定义。如果你打算在Activity中改变Fragment的生命过程。



如果要执行添加、删除、修改的操作,你必须通过FragmentManager的对象获得一个FragmentTransaction对象,通过它的API来执行这些操作。



添加一个Fragment到一个Activity,必须把这个Fragment添加到一个容器视图中。例子:



2012082809233338.png



在Activity中你可以通过getFragmentManager()来获得Fragment对象,然后通过FragmentManager对象的beginFragmentTransaction()方法来获得FragmentTransaction对象。通过它的add()方法来添加一个Fragment到当前的Activity中。
一个FragmentTransaction对象可以执行多个增删修的方法,如果你想把这些修改提交到Activity上,必须在最后调用一下这个对象的commit()方法。例子:



2012082809243379.png



2012082809245182.png



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



2012082809254119.png



4、与其他Fragment的交互



两个单独的Fragment之间是不应该进行通信的。应该使用他们所存在的Activity作为沟通的纽带。



为了实现两个Fragment的交互,您可以在Fragment中定义一个接口,然后再这个接口中定义一个方法,在Fragment的onAttach()方法中调用这个接口中的方法。然后让Activity实现这个方法来完成Activity和Fragment之间的通信。例子:



定义接口并调用方法:



2012082809265161.png



实现接口,在这个方法中可以进行与其他Fragment的数据的交互:



2012082809273598.png



可以通过FragmentManager的findFragmentById()来查找一个Fragment。
2012082809282554.png
2012082809284270.png


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多