Fragment 详解


Fragment 表示 Activity 中的行为或用户界面部分。您能够将多个片断组合在一个 Activity 中来构建多窗格 UI,以及在多个 Activity 中重复使用某个片断。您能够将片断视为 Activity 的模块化组成部分,它具备本身的生命周期,能接收本身的输入事件,而且您能够在 Activity 运行时添加或移除片断(有点像您能够在不一样 Activity 中重复使用的“子 Activity”)。android

目录

-生命周期git

-简单使用github

-Fragment 通讯bash

-源码分析ide

生命周期

Fragment 和 activity 同样,也是有四种状态模块化

Resumed 当前 Fragment 位于前台,用户可见,能够得到焦点;源码分析

Paused 另外一个 Activity 处于前台并拥有焦点, 可是该 Fragment 所在的 Activity 仍然可见(前台 Activity 局部透明或者没有覆盖整个屏幕),不过不能得到焦点;布局

Stopped 要么是宿主 Activity 已经被中止, 要么是 Fragment 从 Activity 被移除但被添加到回退栈中;中止状态的 Fragment 仍然活着(全部状态和成员信息被系统保持着)。 然而, 它对用户再也不可见, 而且若是 Activity 被销毁,它也会被销毁;ui

Destroyed 只能等待被回收。this

Fragment生命周期

附上 Activity 生命周期进行对比

Activity生命周期

Fragment 比 Activity 多了几个额外的生命周期回调方法:

onAttach() 当碎片和活动创建关联时调用。(得到 activity 的传递的值) onCreateView() 为碎片建立视图调用就是加载布局时。 onActivityCreated() 确保与碎片相关联的活动必定已经建立完毕的时候调用。 onDestroyView() 当与碎片的视图被移除的时候调用。 onDetach()当碎片与活动解除关联的时候调用。

简单使用

Fragment 添加到 Activity 中有两种方式一种是静态添加,一种是动态添加

静态添加

在对应的 Activity 中的 xml 中添加,实例以下

<fragment
    android:id="@+id/a_fragment"
    android:name="com.madreain.AFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</fragment>
复制代码

动态添加

通常都是把 xml 布局中的 FrameLayout 做为 Fragment 显示的区域,而后经过 tab 栏按钮来进行多个 Fragment 的切换

Fragment 具体动态添加可参考这个库

有两篇文章很好的讲解了Fragment使用中遇到的问题

Fragment 全解析系列(一):那些年踩过的坑

Fragment 全解析系列(二):正确的使用姿式

FragmentTransaction有一些基本方法,下面给出调用这些方法时,Fragment生命周期的变化:

add(): onAttach()->…->onResume()。 remove(): onPause()->…->onDetach()。 replace(): 至关于旧Fragment调用remove(),新Fragment调用add()。 show(): 不调用任何生命周期方法,调用该方法的前提是要显示的 Fragment已经被添加到容器,只是纯粹把Fragment UI的setVisibility为true。 hide(): 不调用任何生命周期方法,调用该方法的前提是要显示的Fragment已经被添加到容器,只是纯粹把Fragment UI的setVisibility为false。 detach(): onPause()->onStop()->onDestroyView()。UI从布局中移除,可是仍然被FragmentManager管理。 attach(): onCreateView()->onStart()->onResume()。

Fragment 通讯

1.Fragment向Activity传递数据 1).接口回掉的方法 Fragment中定义接口,Activity中实现该接口。

AFragment

public interface OnFragmentCallback {
    void onCallback(Object value);
}
复制代码

AActivity

public class AActivity extends AppCompatActivity implements AFragment.OnFragmentCallback{

    @Override
    public void onCallback(Object value){
        //todo获取Fragment 向 Activity传递的数据
    }

}

复制代码

2).广播方式

广播具体实现参考 BroadcastReciver详解

2.Activity 向 Fragment 传递数据(Bundle 和 setArguments(bundle))

1).Fragment建立时传递数据

在AActivity调用时

AFragment aFragment = AFragment.newInstance(object);
aFragment.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
aFragment.show(getSupportFragmentManager(), AFragment.class.getName());
复制代码

在AFragment中

public class AFragment extends DialogFragment {

    private Object object;

    /**
    * 建立时传入的对象,可传入多个参数
    */
    public static AFragment newInstance(Object object) {
        AFragment fragment = new AFragment();
        Bundle bundle = new Bundle();
        bundle.putBoolean("object", object);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        //省略其余代码
        Bundle bundle = getArguments();
        //获取到传入的值进行显示等使用
        object = bundle.getString("object");
        return v;
    }
}    
复制代码

2).Fragment建立后设置数据

在AFragment中

public class AFragment extends DialogFragment {

    private Object object;

    public void setObject(Object object) { 
        this.object = object;
    }

}
复制代码

在AActivity中设置值

afragment.setObject("object")

复制代码

3).广播方式同上

3.Fragment之间通讯

1).经过Activity做为中介,参考Fragment->Activity传递参数,而后ctivity->Fragment传递参数

2).广播方式同上

源码分析

后续文章将讲解,尽情期待

相关文章
相关标签/搜索