Fragment详解(一)

一,Fragment基本概念


     1.Fragment,简称碎片,是Android 3.0(API 11)提出的,为了兼容低版本,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6。Fragment是依赖于Activity的,不能独立存在的。建议使用V4包的Fragment.

     2,优点:
  2.1,模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。
      2.2,可重用(Reusability):多个Activity可以重用一个Fragment。
      2.3,可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。

 


二,Fragment生命周期

 


1,onAttach():
       Fragment和Activity相关联时调用。可以通过该方法获取 Activity引用,还可以通过getArguments()获取参数。
      如果要获取Activity对象,不建议调用getActivity(),而是在onAttach()中将Context对象强转为Activity对象。

2,onCreate():Fragment被创建时调用。
3,onCreateView():
     最常用,用来创建Fragment的布局。
         需要注意的是inflate()的第三个参数是false,因为在Fragment内部实现中,会把该布局添加到container中,如果设为true,那么就会重复做两次添加.

4,onActivityCreated():当Activity完成onCreate()时调用。
5,onStart():当Fragment可见时调用。
6,onResume():当Fragment可见且可交互时调用。
7,onPause():当Fragment不可交互但可见时调用。
8,onStop():当Fragment不可见时调用。
9,onDestroyView():当Fragment的UI从视图结构中移除时调用。
10,onDestroy():销毁Fragment时调用。
11,onDetach():当Fragment和Activity解除关联时调用。

上面的方法中,只有onCreateView()在重写时不用写super方法,其他都需要。


三,Fragment核心的类有:

     3.1,Fragment:Fragment的基类,任何创建的Fragment都需要继承该类。
  
     3.2,FragmentManager:管理和维护Fragment。他是抽象类,具体的实现类是- FragmentManagerImpl。

     3.3, FragmentTransaction:对Fragment的添加、删除等操作都需要通过事务方式进行。他是抽象类,具体的实现类是BackStackRecord。
            Nested Fragment(Fragment内部嵌套Fragment的能力)是Android 4.2提出的,support-fragment库可以兼容到1.6。通过getChildFragmentManager()能够获得管理子Fragment的FragmentManager,在子Fragment中可以通过getParentFragment()获得父Fragment。

 

 

四,在Activity使用Fragment:

(一)静态方式,缺点是一旦添加就不能在运行时删除。

<fragment

android:name="laobi.com.home.fragment.Fragment1_Home"

android:id="@+id/fragment1"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

 

(二)动态方式

- 采用replace替换fragment的方式,节省内存,因为每次切换,都会回收上一个fragment

      // 1,获取fragmentManager

        FragmentManager fragmentManager = getSupportFragmentManager();

        // 2,开启事物

        FragmentTransaction tr = fragmentManager.beginTransaction();

        // 3,替换容器中的内容

        Fragment1_Home fragment= new Fragment1_Home();

        tr.replace(R.id.container, fragment);

        //4,提交事物

        tr.commit();


     

五,向Fragment传值.

 

3.1,在创建Fragment时要传入参数,必须要通过setArguments(Bundle bundle)方式添加,而不建议通过为Fragment添加带参数的构造函.

 

3.2, 因为通过setArguments()方式添加,在由于内存紧张导致Fragment被系统杀掉并恢复(re-instantiate)时能保留这些数据。官方建议如下:

public class Fragment1_Home extends BaseHomeFragment {


public static Fragment newInstance(Bundle bundle) {

    Fragment1_Home fragment1 = new Fragment1_Home();

    fragment1.setArguments(bundle);

    return fragment1;

}

 

3.3,我们可以在Fragment的onAttach()中通过getArguments()获得传进来的参数,并在之后使用这些参数。

 

六,fragment向fragment传值

可以使用EventBus,接口回调,也可以使用下面的几种方式:

- 1,方式一:先调用getFragmentManager()对象,然后调用findFragmentById()方法获得目标fragment,将数据传递到目标fragment

   //setTextView()是目标fragment自己定义的方法
   Fragment fragment_left = getFragmentManager().findFragmentById(R.id.fragment_left);

   fragment_left.setTextView(et_frafment.getText().toString().trim())

      

- 2,方式二: 先调用getFragmentManager()对象,然后调用findFragmentById()方法获得目标fragment,再调用getView()获得目标fragment的view对象,最后调用view的findViewById()获得目标控件              

  TextView tv_fragment= (TextView)getFragmentManager()

                        .findFragmentById(R.id.fragment_left).getView().findViewById(R.id.tv_fragment);

 

- 3,方式三:先调用getActivity()获取所在的activity对象后,然后通过findViewById()找到目标控件(该目标fragment在activity中,所以可以通过activity进行findViewById)               

 TextView tv_fragment = (TextView)getActivity().findViewById(R.id.tv_fragment);

 tv_fragment.setText(et_frafment.getText().toString().trim());

七,Fragment回退栈

 

1,对于Activity,当按返回键时,能够返回到上一个Activity,但是,当我们Fragment到Activity中时,如果不做任何处理,当按返回键时,当前Fragment都会全部退出.

如果想要拥有Activity逐渐退出的效果,我们需要应用一下Fragment中的回退栈.

 

2,大家可以自行打开京东,你会发现,如果你点击了分类,发现,购物车,我的,按钮,再按返回键的话,会先回到首页,然后再退出应用.这里应用的就是Fragment的回退栈功能

3,重要方法:

3.1,addToBackStack(tag); 将Fragment添加到回退栈中

3.2,popBackStack(); 清除回退栈中栈顶的Fragment

3.3,popBackStack(String tag, int i );

如果i=0,回退到该tag所对应的Fragment层

如果i=FragmentManager.POP_BACK_STACK_INCLUSIVE,回退到该tag所对应的

Fragment的上一层

3.4,popBackStackImmediate 立即清除回退栈中栈顶Fragment

3.5,getBackStackEntryCount(); 获取回退栈中Fragment的个数

3.6,getBackStackEntryAt(int index) 获取回退栈中该索引值下的Fragment

回退栈代码实现:Android之Fragment回退栈详解

 

借鉴:

1,Android Fragment生命周期

https://blog.csdn.net/wccchangchun/article/details/51203640

2,Android基础:Fragment,看这篇就够了

https://www.jianshu.com/p/28ca4cbe190c

3,Android Fragment 非常详细的一篇

https://www.jianshu.com/p/11c8ced79193

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值