android中的fragment

来源:互联网 发布:清朗网络海报 编辑:程序博客网 时间:2024/06/07 02:04

        在android 3.0的时候,google推出了fragment,深受大家的喜爱。究其原因,是因为fragment极大部分解决了android中的碎片化问题,它使得android的屏幕适配更简单。那么,fragment到底有和魅力呢?下面就让我们一起来看看吧。


    fragment的生命周期:

    fragment作为对activity的补充,其生命周期与activity的生命周期很类似。换句话说,fragment的生命周期是受所属的activity的生命周期的管理的,但是对于fragment自身而言,它也有属于自己的生命周期。


activityfragmentonCreateonAttach-->onCreate-->onCreateView-->onActivityCreatedonStartonStartonResumeonResumeonPauseonPauseonStoponStoponDestroyonDestroyView-->onDestroy-->onDetachonRestart  
仔细观察上面的表格就会发现,其实fragment的生命周期和activity的生命周期很类似,甚至可以说大部分的都完全一致,仅仅只是在onCreate和onDestroy有些区别,在fragment中多了几个方法。那么这些方法主要是实现什么功能的呢?


其实多的这几个方法都是成对出现的:


             onAttach():activity与fragment关联时调用

             onDetach():activity与fragment取消关联时调用


             onCreateView():添加fragment的视图

             onDestroyView():移除fragment的视图


              onActivityCreated():当activity的onCreate方法返回时调用


了解了fragment的这些基本信息,下面我们就一起来使用fragment吧。在使用fragment的时候,我们有两种方法来对fragment进行添加:即静态添加和动态添加


1》静态添加

静态添加:把fragment当做普通的组件直接在xml文件中进行声明,这是最简单最直接使用fragment的方式

04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onAttach------>TestFragment04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onCreate------>TestFragment04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onCreateView------>TestFragment04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onCreate----->MainActivity04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onActivityCreated------>TestFragment04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onStart------>TestFragment04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onStart----->MainActivity04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onResume----->MainActivity04-13 10:05:06.550 22925-22925/com.juwang.androidactivity I/MainActivity: onResume------>TestFragment
从上面打印的生命周期我们可以知道,首先执行activity所属的fragment的onAttach-->onCreate-->onCreateView,然后再执行activity的onCreate方法等等。


当从fragment跳转到新的activity的时候,会执行:

04-13 10:15:00.240 1347-1347/com.juwang.androidactivity I/MainActivity: onPause------>TestFragment04-13 10:15:00.240 1347-1347/com.juwang.androidactivity I/MainActivity: onPause----->MainActivity04-13 10:15:00.670 1347-1347/com.juwang.androidactivity I/MainActivity: onStop------>TestFragment04-13 10:15:00.670 1347-1347/com.juwang.androidactivity I/MainActivity: onStop----->MainActivity

回退到原来的activity:

04-13 10:16:37.140 1347-1347/com.juwang.androidactivity I/MainActivity: onRestart----->MainActivity04-13 10:16:37.140 1347-1347/com.juwang.androidactivity I/MainActivity: onStart------>TestFragment04-13 10:16:37.140 1347-1347/com.juwang.androidactivity I/MainActivity: onStart----->MainActivity04-13 10:16:37.140 1347-1347/com.juwang.androidactivity I/MainActivity: onResume----->MainActivity04-13 10:16:37.140 1347-1347/com.juwang.androidactivity I/MainActivity: onResume------>TestFragment

退出应用:

04-13 10:17:28.530 1347-1347/com.juwang.androidactivity I/MainActivity: onPause------>TestFragment04-13 10:17:28.530 1347-1347/com.juwang.androidactivity I/MainActivity: onPause----->MainActivity04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onStop------>TestFragment04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onStop----->MainActivity04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onDestroyView------>TestFragment04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onDestroy------>TestFragment04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onDetach------>TestFragment04-13 10:17:28.820 1347-1347/com.juwang.androidactivity I/MainActivity: onDestroy----->MainActivity

从上面打印的生命周期我们可以总结出以下几点:

(1)fragment的生命周期受其所属的activity的生命周期的影响,即当activity被销毁的时候,对应的fragment也被销毁。

(2)fragment有其自己独立的一套生命周期

(3)除了在创建和销毁的时候fragment的生命周期会有所不同外,其他时候的生命周期和activity基本一致。

(4)fragment中实例和视图并不是共生共灭的。


2》动态添加

动态添加:以代码的形式动态管理fragment的添加移除等。

打开fragment的时候执行的方法:

10-17 08:34:13.446 26756-26756/com.zhoufan.fragmentdemo I/ZF: onCreate ---> MainActivity10-17 08:34:13.448 26756-26756/com.zhoufan.fragmentdemo I/ZF: onStart ---> FragmentOne10-17 08:34:13.448 26756-26756/com.zhoufan.fragmentdemo I/ZF: onCreate ---> FragmentOne10-17 08:34:13.448 26756-26756/com.zhoufan.fragmentdemo I/ZF: onCreateView ---> FragmentOne10-17 08:34:13.450 26756-26756/com.zhoufan.fragmentdemo I/ZF: onActivityCreated ---> FragmentOne10-17 08:34:13.451 26756-26756/com.zhoufan.fragmentdemo I/ZF: onStart ---> FragmentOne10-17 08:34:13.451 26756-26756/com.zhoufan.fragmentdemo I/ZF: onStart ---> MainActivity10-17 08:34:13.457 26756-26756/com.zhoufan.fragmentdemo I/ZF: onResume ---> MainActivity10-17 08:34:13.457 26756-26756/com.zhoufan.fragmentdemo I/ZF: onResume ---> FragmentOne

当从fragment跳转到新的activity的时候,会执行:

10-17 08:47:55.568 7803-7803/com.zhoufan.fragmentdemo I/ZF: onPause ---> FragmentOne10-17 08:47:55.568 7803-7803/com.zhoufan.fragmentdemo I/ZF: onPause ---> MainActivity10-17 08:47:56.227 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStop ---> FragmentOne10-17 08:47:56.227 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStop ---> MainActivity

回退到原来的activity:
10-17 08:48:49.801 7803-7803/com.zhoufan.fragmentdemo I/ZF: onRestart ---> MainActivity10-17 08:48:49.801 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStart ---> FragmentOne10-17 08:48:49.801 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStart ---> MainActivity10-17 08:48:49.802 7803-7803/com.zhoufan.fragmentdemo I/ZF: onResume ---> MainActivity10-17 08:48:49.802 7803-7803/com.zhoufan.fragmentdemo I/ZF: onResume ---> FragmentOne


退出Activity

10-17 08:49:35.233 7803-7803/com.zhoufan.fragmentdemo I/ZF: onPause ---> FragmentOne10-17 08:49:35.233 7803-7803/com.zhoufan.fragmentdemo I/ZF: onPause ---> MainActivity10-17 08:49:35.758 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStop ---> FragmentOne10-17 08:49:35.758 7803-7803/com.zhoufan.fragmentdemo I/ZF: onStop ---> MainActivity10-17 08:49:35.758 7803-7803/com.zhoufan.fragmentdemo I/ZF: onDestroyView ---> FragmentOne10-17 08:49:35.759 7803-7803/com.zhoufan.fragmentdemo I/ZF: onDestroy ---> FragmentOne10-17 08:49:35.759 7803-7803/com.zhoufan.fragmentdemo I/ZF: onDetach ---> FragmentOne10-17 08:49:35.760 7803-7803/com.zhoufan.fragmentdemo I/ZF: onDestroy ---> MainActivity

通过上面的对比可以发现,直接添加和动态添加除了刚开始添加时候的生命周期有点区别,其他的都是一样的



2.1》Fragment家族常用的API

              Fragment常用的三个类:

              android.app.Fragment 主要用于定义Fragment

              android.app.FragmentManager 主要用于在Activity中操作Fragment

              android.app.FragmentTransaction 保证一些列Fragment操作的原子性


     2.2》Fragment的一些常用的操作方法

               a、获取FragmentManage的方式:

                     getFragmentManager() // v4中,getSupportFragmentManager

               b、主要的操作都是FragmentTransaction的方法

                      FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

                      transaction.add()

                      往Activity中添加一个Fragment

                      transaction.remove()

                     从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。

                     transaction.replace()

                     使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~

                     transaction.hide()

                     隐藏当前的Fragment,仅仅是设为不可见,并不会销毁

                     transaction.show()

                     显示之前隐藏的Fragment

                     detach()

                     会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。

                     attach()

                     重建view视图,附加到UI上并显示。

                     transatcion.commit()//提交一个事务

在这里我只贴下主Activity就好,大家一看就懂

package com.juwang.androidactivity;

import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;

import com.juwang.androidactivity.fragment.BlankFragment;
import com.juwang.androidactivity.fragment.TestFragment;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";
    private TextView testFragment;
    private TextView blankFragment;
    private TestFragment test;
    private BlankFragment blank;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        testFragment = (TextView) findViewById(R.id.test_fragment);
        blankFragment = (TextView) findViewById(R.id.blank_fragment);
        testFragment.setOnClickListener(this);
        blankFragment.setOnClickListener(this);
        setDefaultFragment();
    }

    /**
     * 设置默认的fragment
     */
    private void setDefaultFragment() {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        test = new TestFragment();
        transaction.replace(R.id.fg_show, test);
        transaction.commit();
    }

    @Override
    public void onClick(View v) {
        FragmentManager fm = getSupportFragmentManager();
        // 开启Fragment事务
        FragmentTransaction transaction = fm.beginTransaction();
        switch (v.getId()) {
            case R.id.test_fragment:
                if (test == null) {
                    test = new TestFragment();
                }
                transaction.replace(R.id.fg_show, test);
                break;
            case R.id.blank_fragment:
                if (blank == null) {
                    blank = new BlankFragment();
                }
                transaction.replace(R.id.fg_show, blank);
                break;
        }
        // transaction.addToBackStack();
        // 事务提交
        transaction.commit();
    }
}

值得注意的是:如果你喜欢使用Fragment,一定要清楚这些方法,哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏,这样才能更好的使用它们。

a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。

b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。

c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。


好了,以上就是关于fragment的一些基本介绍,下一篇我们就开始讲述fragment的一些经典用法和使用fragment的过程中需要注意的一些问题。欢迎大家留言。








0 0