盒子
盒子
文章目录
  1. Fragemnt的生命周期
  2. 源码实现
  3. Fragment与Activity之间的通信
  4. Fragment数据的保留
  5. Fragment的封装与解耦

探索Fragment

我们坚持AUF(Always Use Fragments)原则

Fragemnt的生命周期

Fragment的生命周期

  • onAttach()
  • 当碎片和活动建立关联的时候调用。

  • onCreateView()
  • 为碎片创建视图(加载布局)时调用。

  • onActivityCreated()
  • 确保与碎片相关联的活动一定已经创建完毕的时候调用。

  • onDestroyView()
  • 当与碎片关联的视图被移除的时候调用。

  • onDetach()
  • 当碎片和活动解除关联的时候调用。

    源码实现

    静态加载:

    主布局文件:

    1
    2
    3
    4
    5
    6
    <fragment
    android:id="@+id/first_fragment"
    android:name="io.github.grooters.FirstFragment"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"/>

    android:name指明Fragment类

    FirstFragment.class:

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

    动态加载:

    MainActivity,activity_main:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FragmentManager manager=getSupportFragmentManager();
    FragmentTransaction transaction=manager.beginTransaction();
    FragmentOne fragmentOne=new FragmentOne();
    transaction.replace(R.id.fragment_container,fragmentOne,"one");
    transaction.commit();

    <FrameLayout
    android:id="@+id/fragment_container"
    android:layout_marginTop="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

    FragmentOne:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    private final String TAG=FragmentOne.class.getSimpleName();
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v=inflater.inflate(R.layout.fragment_one,container,false);
    Button button=v.findViewById(R.id.create_fragment);
    button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    FragmentManager manager=getFragmentManager();
    FragmentTransaction transaction=manager.beginTransaction();
    transaction.replace(R.id.fragment_container,new FragmentTwo(),"two");
    transaction.addToBackStack("one");
    transaction.commit();
    }
    });
    return v;
    }

    @Override
    public void onDestroyView() {
    super.onDestroyView();

    Log.i(TAG,"onDestroyView");
    }
    @Override
    public void onDestroy() {
    super.onDestroy();

    Log.i(TAG,"onDestroy");
    }
    @Override
    public void onDetach() {
    super.onDetach();

    Log.i(TAG,"onDetach");
    }

    FragmentTwo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    private final String TAG=FragmentTwo.class.getSimpleName();
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    }
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v=inflater.inflate(R.layout.fragment_two,container,false);
    return v;
    }
    @Override
    public void onDestroyView() {
    super.onDestroyView();
    Log.i(TAG,"onDestroyView");
    }
    @Override
    public void onDestroy() {
    super.onDestroy();
    Log.i(TAG,"onDestroy");
    }
    @Override
    public void onDetach() {
    super.onDetach();
    Log.i(TAG,"onDetach");
    }

    在FragmentOne中的transaction.addToBackStack(“one”)是将FragmentOne添加进回退栈中,在跳转到下一个Fragment时只会销毁FragmentView,即只执行DestroyView方法,当在下一个Fragment回退时会返回到该Fragment,若没有该行代码,在跳转到下一个Fragment时会销毁整个Fragment,即执行DestoryView,Destroy和Detach方法

    Fragment与Activity之间的通信

    从属关系下的Fragment和Activity:

    Activity拥有Fragment的引用,Fragment可调用getActivity获取Activity的上下文

    要进行通信的Fragment不属于该Activity:

    Activity可以通过FragmentManager对象中的findFragmentByTag或findFragmentById

    1
    2
    FragmentTwo fragment=(FragmentTwo) getSupportFragmentManager().findFragmentByTag("two");
    fragment.getInfo("give you ok?");

    tag为之前replace或add传入的tag

    Fragment可以通过getActivity获取关联的Activity的上下文然后通过在该Activity中获取目标activity的相关方法,即通过关联Activity作为代理

    通过setArgument传送数据:

    1
    2
    3
    4
    5
    6
    7
    8
    //取出传过来的学生,再次封装到bundle中
    bundle.putSerializable("Student",getIntent().getSerializableExtra("Student"));
    //通过setArguments方法存入该fragment
    studentListFragment.setArguments(bundle);
    return studentListFragment;

    //通过getArguments方法取出对象,不能在构造方法取,因为实例化该Fragment时,还未setArgument
    Student student=(Student) getArguments().getSerializable("Student");

    Fragment数据的保留

    当遇到活动销毁时其托管的Fragment也会随之销毁,为了保留Fragment的数据,可以通过Fragment类中的方法:

    1
    setRetainInstance(true)

    当调用了该方法,传入的参数为true时,在Activity销毁时,会立即销毁Fragment绑定的视图,即调用onDestroyView方法(为了适应屏幕旋转后视图的改变)

    Fragment的封装与解耦

    BaseFragment.class:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContainer(R.layout.fragment_main);
    Fragment fragment=createFragment();
    FragmentManager fm=getFragmentManager();
    fm.beginTransaction().replace(R.id.frame_container,fragment).commit();
    }
    public abstract Fragment createFragment();
    支持一下
    扫一扫,支持Grooter
    • 微信扫一扫
    • 支付宝扫一扫