Fragment详解

一、Fragment为什么被称为第五大组件?

为了使手机屏幕能更更灵活的展示UI组件,因此产生了Fragment。Fragment有自己的生命周期,使用频率也很高。

FragmentPagerAdapter与FragmentStatePagerAdapter的区别:

由于FragmentPagerAdapter在销毁item时,只是调用了他的detach()方法,因此组件并没有被真正的销毁,而FragmentStateAdapter在销毁item时,调用的方法是remove(),UI组件被真正的销毁,更加节省内存,所以如果Fragment比较多的情况下应尽量使用FragmentStatePagerAdapter

二、Fragment的生命周期



1.  onAttach()
         
作用:fragment已经关联到activity,这个时候 activity已经传进来了,获得activity的传递的值就可以进行activity的通信里,当然也可以使用getActivity(),前提是这个fragment已经和宿主的activity关联,并且没有脱离,有且只有调用一次。

 2.onCreate()

         系统创建fragment的时候回调他,在他里面实例化一些变量这些个变量主要是:当你暂停停止的时候你想保持的数据他只调用一次。

3.onCreateView()

         第一次使用的时候 fragment会在这上面画一个layout出来,为了可以画控件要返回一个布局的view,也可以返回null j 就什么都没有显示。 

           当系统用到fragment的时候 fragment就要返回他的view,越快越好,所以尽量在这里不要做耗时操作,比如从数据库加载大量数据

4.onActivityCreated()

             Activity中的onCreate方法执行完后调用。

注意了:
            从这句官方的话可以看出:当执行onActivityCreated()的时候 activityonCreate才刚完成。所以在onActivityCreated()调用之前 activityonCreate可能还没有完成,所以不能再onCreateView()中进行activity有交互的UI操作,UI交互操作可以在onActivityCreated()里面进行。所以呢,这个方法主要是初始化那些你需要你的父Activity或者FragmentUI已经被完整初始化才能初始化的元素。

5.onStart()

       activity一致,启动Fragement 启动时回调,,此时Fragement可见。
6.onResume()

        activity一致activity中运行是可见的。激活, Fragement 进入前台, 可获取焦点时激活。

 7.onPause()

        activity一致其他的activity获得焦点,这个仍然可见第一次调用的时候,指的是用户离开这个fragment(并不是被销毁)通常用于用户的提交(可能用户离开后不会回来了)
8.onStop()

       activity一致, fragment不可见的,可能情况:activitystopped了或者 fragment被移除但被,加入到回退栈中,一个stoppedfragment仍然是活着的如果长时间不用也会被移除。

9.   onDestroyView() 

      Fragment中的布局被移除时调用。表示fragemnt销毁相关联的UI布局,清除所有跟视图相关的资源。然后这个知识移除视图  并没有销毁而且还没有脱离activity

 10.onDestroy()

       销毁fragment对象,activity类似了。
11.onDetach()

       FragmentActivity解除关联的时候调用。脱离activity

三、Fragment的两种加载方式

1、静态加载方式:

step1:在layout下创建Fragment的布局文件。

step2:创建自己的Fragment类,继承Fragment或其子类。实现onCreateView()方法,在该方法中使用Inflator创建一个View对象并返回。

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


        View view=inflater.inflate(R.layout.myfragment,container,true);
        return  view;
    }

step3:在Fragment所属的Activity的布局文件中添加Fragment例如:

        <fragment
            android:id="@+id/myFragement"
            android:name="com.example.pc.httpconnectiontest.myFragment"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:layout_weight="1"

            />

2、动态加载方式:

step1:创建一个Fragment的布局文件。

step2:与静态加载方法相同,创建一个自己的Fragment类继承Frament或其子类。

step3:在所属的Activity的布局文件中添加Fragment的container。

    <FrameLayout
        android:id="@+id/container_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

step4:在Activity中通过 getFragmentManager()来获取到FragmentManager,通过FragmentManager的beginTransaction()创建事务,然后,通过FragmentTrasaction的add()方法创建Fragment,最后别忘了Commit()来提交事务。

 firstFragment=new FirstFragment();
 manager= getFragmentManager();
        transaction=manager.beginTransaction() ;
        transaction.add(R.id.container_fragment,firstFragment).commit();

四、Fragment之间的通信

1、在Fragment中调用Activity中的方法 getActivity()。

2、在Activity中调用Fragment中的方法可用接口回调。

具体方法:

step1:现在Fragment中定义一个接口。

 public interface callBack{

        void sendData(String str);
    }

step2:在所属Activity中实现该接口。

public class MainActivity extends AppCompatActivity implements View.OnClickListener , FirstFragment.callBack {
....
 @Override
    public void sendData(String str) {
        Toast.makeText(MainActivity.this,""+str,Toast.LENGTH_LONG).show();
    }
}

step3:在Fragment的onAttach()方法中获取实例,并且调用他的方法,传送数据。

  @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        sendData= (callBack) getActivity();
        sendData.sendData("我是FirstFragment发来的消息。。。");


    }
3、在Fragment中调用其他Fragment的方法,利用findFragmentById实现。

五、Fragment管理器:FragmentManager

FragmentManager常用的方法有:

add()添加一个Fragment

remove()移除一个Fragment

replace(Fragment1,Fragment2)用Fragment1替换Fragment2。

show()显示一个Fragment。

hide()隐藏一个Fragment。


猜你喜欢

转载自blog.csdn.net/mahuicool/article/details/80224740