Fragment生命周期及其使用

Fragment是随着Android 3.0推出时携带的一部分,若是在1.6版本中使用,必须引入相应的支持包。Fragment最大的优点是你可以根据不同设备的屏幕大小创建动态的UI。Fragment有以下几个特点。

  • 每个Fragment是个独立的模块
  • 与其所在的Activity紧密的联系在一起
  • 多个Activity可以共用一个Activity

1.Fragment生命周期。

首先来看下Fragment的生命周期,Fragment的生命周期和他所在的Activity的生命周期紧密联系在一起。因此看下Fragment的生命周期对理解Fragment是很有必要的。Fragment的生命周期可以用一张图来表示。

从图中可以看出Fragment的生命周期和Activity的生命周期相似,只不过是多了几个状态而已。其中从onDestroyView返回到onCreateView是需要在commit方法之前调用addToBackStack当中。

2.Fragment的创建和使用。

常用使用Fragment的方式有两种。

方法1:在Actvity的layout布局中嵌入fragment标签,该fragment必须要有android:id,否则编译会报错。

方法2:在Activity的layout布局当中可以先添加FrameLayout的view,然后再代码中动态添加Fragment。

注:在使用Fragment时,若通过Activity的支持包使用Fragment,则必须使Activity继承自FragmentActivity。即在引用Fragment的相关的类时,要确保他们来自相同的包。虽然Android本地包和Fragment支持包都有Fragment相关的类,但是不能互用。

下面来看两个示例。

示例(方法1):通过在layout中使用fragment来添加Fragment。

首先,在创建一个fragment的布局文件fragment_firts.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical" android:layout_width="match_parent"
 4     android:layout_height="match_parent">
 5     <TextView
 6         android:layout_width="match_parent"
 7         android:layout_height="wrap_content"
 8         android:textSize="20dp"
 9         android:text="This is FIRST fragment"/>
10
11 </LinearLayout>

其次,创建一个MyFirstFragment继承自Fragment(这里使用的是Android包中的fragment,即android.app.Fragment),并使用上述布局。代码也很简单。

1 public class MyFirstFragment extends Fragment {
2     @Nullable
3     @Override
4     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
5
6         return inflater.inflate(R.layout.fragment_first,container,false);
7     }
8 }

最后,在MyActivity的layout中使用fragment标签引用MyFirstFragment。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical" android:layout_width="match_parent"
 4     android:layout_height="match_parent">
 5     <TextView
 6         android:layout_width="match_parent"
 7         android:layout_height="wrap_content"
 8         android:text="MyActivity"
 9         android:textSize="20dp"/>
10     <fragment
11         android:id="@+id/first_fragment"
12         android:name="com.example.zhouy.androidexercise.MyFirstFragment"
13         android:layout_width="match_parent"
14         android:layout_height="match_parent" />
15 </LinearLayout>

运行下看结果如下。

 在利用动态方式添加Fragment之前,我们先了解下fragment在代码中添加 删除和替换的方式

不管是添加、删除和替换fragment,都需要经历的步骤是

a.在Actvity中利用getFragmentManager()获取Fragment管理类FragmentManager

b.利用FragmentManager获取Transaction

c.通过Transaction来实现对Fragment的动态添加、删除和替换。

d.Transaction通过commit方法完成对Fragment的操作

这几个步骤将在利用方式2动态添加时使用,具体使用方法见示例2

示例(方式2):通过预留的View添加Fragment,通常使用FrameLayout来作为Fragment的容器。

首先,再次创建一个MySecondFragment,布局和MyFirstFragment相似,不再赘述。

其次,修改activity_my.xml的标签,添加几个按钮即添加、删除、替换,Fragment加入栈中,修改后的xml如下。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical" android:layout_width="match_parent"
 4     android:layout_height="match_parent">
 5     <TextView
 6         android:layout_width="match_parent"
 7         android:layout_height="wrap_content"
 8         android:text="MyActivity"
 9         android:textSize="20dp"/>
10     <Button
11         android:id="@+id/add_by_framelayout"
12         android:layout_width="match_parent"
13         android:layout_height="wrap_content"
14         android:textSize="20dp"
15         android:text="Framelayout添加"/>
16     <Button
17         android:id="@+id/remove_by_framelayout"
18         android:layout_width="match_parent"
19         android:layout_height="wrap_content"
20         android:textSize="20dp"
21         android:text="删除"/>
22     <Button
23         android:id="@+id/replace_by_framelayout"
24         android:layout_width="match_parent"
25         android:layout_height="wrap_content"
26         android:textSize="20dp"
27         android:text="替换"/>
28     <FrameLayout
29         android:id="@+id/for_secondfragment"
30         android:layout_width="wrap_content"
31         android:layout_height="wrap_content"></FrameLayout>
32     <fragment
33         android:id="@+id/first_fragment"
34         android:name="com.example.zhouy.androidexercise.MyFirstFragment"
35         android:layout_width="match_parent"
36         android:layout_height="match_parent" />
37 </LinearLayout>

然后,在MyActivity中添加一个addFragment方法。具体代码如下

 1 import android.app.Activity;
 2 import android.app.Fragment;
 3 import android.app.FragmentManager;
 4 import android.app.FragmentTransaction;
 5 import android.os.Bundle;
 6 import android.util.Log;
 7 import android.view.View;
 8 import android.widget.Button;
 9 import android.widget.FrameLayout;
10
11 public class MyActivity extends Activity implements View.OnClickListener {
12
13     private Button mAddSecondBtn = null;
14
15     private FrameLayout mFragment = null;
16
17     private FragmentManager mFragmentManager = null;
18
19     private FragmentTransaction mTransaction = null;
20
21     private Fragment mSecondFragment = null;
22
23     @Override
24     protected void onCreate(Bundle savedInstanceState) {
25         super.onCreate(savedInstanceState);
26         setContentView(R.layout.activity_my);
27         mAddSecondBtn = (Button)findViewById(R.id.add_by_framelayout);
28         mAddSecondBtn.setOnClickListener(this);
29         mFragment = (FrameLayout)findViewById(R.id.for_secondfragment);
30         //a.获取FragmentManager
31         mFragmentManager = getFragmentManager();
32
33     }
34
35     private void addSecondFragment(){
36         if(null == mSecondFragment){
37             mSecondFragment = new MySecondFragment();
38         }
39         if(null != mFragment){
40             Log.v("Tag","开始添加fragment");
41             //b.获取Transaction
42             mTransaction = mFragmentManager.beginTransaction();
43             //c.添加Fragment
44             mTransaction.add(R.id.for_secondfragment,mSecondFragment);
45             //d.提交添加
46             mTransaction.commit();
47         }
48     }
49
50     @Override
51     public void onClick(View view) {
52         switch (view.getId()){
53             case R.id.add_by_framelayout:
54                 addSecondFragment();
55                 break;
56         }
57     }
58 }

当然这部分代码存在一点儿问题,待会儿再说,我们先运行一下看看结果。点击添加按钮,结果如下

然而当我们再点击一下添加就会出现程序运行停止,看看LogCat日志出现了异常,说得很明白是已经添加了一个Fragment,这就是刚才所说的小问题。那么如何避免重复添加呢,我们稍微修改下addFragment方法就可以解决掉这个问题。修改后的方法如下。

 1     private void addSecondFragment(){
 2         MySecondFragment fragment = (MySecondFragment) mFragmentManager.
 3                 findFragmentById(R.id.for_secondfragment);
 4         if(null == mSecondFragment){
 5             mSecondFragment = new MySecondFragment();
 6         }
 7         if(null == fragment ){
 8             Log.v("Tag","开始添加fragment");
 9             //b.获取Transaction
10             mTransaction = mFragmentManager.beginTransaction();
11             //c.添加Fragment
12             mTransaction.add(R.id.for_secondfragment,mSecondFragment);
13             //d.提交添加
14             mTransaction.commit();
15         }
16     }

剩下的删除和替换和添加Fragment步骤相似,就是remove和replace的区别。具体替换和删除方法代码如下

    private void removeSecondFragment(){
        MySecondFragment fragment = (MySecondFragment) mFragmentManager.
                findFragmentById(R.id.for_secondfragment);
        if(null != fragment ){
            //b.获取Transaction
            mTransaction = mFragmentManager.beginTransaction();
            //c.删除Fragment
            mTransaction.remove(fragment);
            //d.提交添加
            mTransaction.commit();
        }
    }

    private void replaceSecondFragment(){
        Fragment fragment = (Fragment) mFragmentManager.
                findFragmentById(R.id.for_secondfragment);
        if(null != fragment ){
            //b.获取Transaction
            mTransaction = mFragmentManager.beginTransaction();
            //c.替换Fragment
            mTransaction.replace(R.id.for_secondfragment,new MyFirstFragment());
            //d.提交添加
            mTransaction.commit();
        }
    }

Fragment的back栈

有时,用户在按back键时,需要回退到前一个布局,同样的也要回到之前已执行的Transaction。Android提供了addToBackStack来将Fragment添加到back栈中。调用addToBackStack需要在commit之前调用。

比如修改replaceFragment方法,在replace之后,commit之前添加addToBackStack,在按back键时,界面会回到替换之前的界面。代码如下。

    private void replaceSecondFragment(){
        Fragment fragment = (Fragment) mFragmentManager.
                findFragmentById(R.id.for_secondfragment);
        if(null != fragment ){
            //b.获取Transaction
            mTransaction = mFragmentManager.beginTransaction();
            //c.替换Fragment
            mTransaction.replace(R.id.for_secondfragment,new MyFirstFragment());
            String tag = null;
            mTransaction.addToBackStack(null);  //将Fragment添加到栈中
            //d.提交添加
            mTransaction.commit();
        }
    }

				
时间: 2024-11-05 11:48:30

Fragment生命周期及其使用的相关文章

打入电话时Fragment生命周期

Activity初次加载: MainActivity--->onCreate Mfragment---->onAttach Mfragment---->onCreate Mfragment---->onCreateView Mfragment---->onActivityCreated MainActivity--->onStart Mfragment---->onStart MainActivity--->onResume Mfragment---->

fragment生命周期及优点

fragment生命周期切换到该FragmentonAttach—> onCreate-> onCreateView—> onActivityCreated-> onStart-> onResume切换到其他Fragment:onPause-> onStop-> onDestroyView切换回本身的Fragment:onCreateView-> onActivityCreated-> onStart-> onResume显示Fragment时(

关于fragment生命周期的两张图片

图1,fragment的生命周期,图2,fragment生命周期对应activity的生命周期

Fragment生命周期(转)

Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互.Fragment允许这样的一种设计,而不需要你亲自来管理viewhierarchy的复杂变化. 通过将activity的布局分散到fragment中, 你可以在运行时修改activity的外观,并在由activity管理的back stack中保存那些变化. 例如, 一

Activity生命周期和Fragment生命周期

工作时间不短了,却没怎么总结过.一直想对android的学习做个记录,那从这儿起吧.从最基础的知识一点点开始.很多内容是从大神那里搜罗来的. 一.Fragment生命周期图 二.Activity与Fragment生命周期比较

Android Activity生命周期以及Fragment生命周期的区别与分析

Android Fragment生命周期图: Activity生命周期图: 对照图: Fragment生命周期分析: 1. 当一个fragment被创建的时候,它会经历以下状态. onAttach() onCreate() onCreateView() onActivityCreated() 2. 当这个fragment对用户可见的时候,它会经历以下状态. onStart() onResume() 3. 当这个fragment进入“后台模式”的时候,它会经历以下状态. onPause() onS

Fragment生命周期-基于实验的最新总结

现在很多应用的开发都是基于FragmentActivity中嵌套Fragment进行开发的,所以,如果我们能够清晰地知道他们的生命周期,那么会使我们的开发变的容易. 对于Activity的生命周期,我在之前的文章 Activity生命周期-基于实验的最新总结  中已经说的很详细了,因此本篇文章只是从实践角度来讲一下Fragment的生命周期以及Fragment与Activity生命周期的对应关系,像大多数介绍Fragment生命周期的文章一样,先上两张图: 好,言归正传 这里从实例的角度来说明一

三张图让你快速明白activity与fragment生命周期的异同点

第一张图:activity的生命周期 第二张图:fragment的生命周期 第三张图:activity与fragment生命周期对比 补充:如果你还是不明白,请翻译一下你不理解的对应单词. ---------------------------------------------------------------------------------------- 有什么问题,大家可以一起交流-- 更多精彩关于关注博主的微信订阅号:非常周末 微信搜索:非常周末 你可以扫描一下关注即可:

Fragment(四)Fragment生命周期分析(转)

Fragment(四)Fragment生命周期分析 转载请注明:http://blog.csdn.net/liaoqianchuan00/article/details/24271607   例子一 从Layout中加载Fragment:   假设我们有一个Activity的Layout中有两个Fragment: <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=