Android开发经验谈

Android基础回顾(三)| 关于Fragment

2018-11-19  本文已影响7人  CCCode1997

参考书籍:《第一行代码》 第二版 郭霖
如有错漏,请批评指出!

Fragment的简单使用

Fragment的生命周期

和Activity一样,Fragment也有自己的生命周期,并且它的生命周期和Activity很相似。

为了直观感受Fragment的生命周期,我们通过一个例子来观察创建及销毁一个Fragment完整的生命周期:
还是通过修改前面的例子,我们给重写Fragmeng的每个生命周期方法,加上打印信息(这里只给出TopFragment1的代码,TopFragment2一样):

public class TopFragment1 extends Fragment {

    private final String TAG = "Fragment1";

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.d(TAG, "onAttach");
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView");
        return inflater.inflate(R.layout.fragment_top1, container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d(TAG, "onActivityCreated");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d(TAG, "onStop");
    }

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

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

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

为了生命周期的过程更加清晰,我们用replace()的方式来切换Fragment:

public class MainActivity extends AppCompatActivity {

    private TopFragment1 fragment1;
    private TopFragment2 fragment2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick({R.id.but_left, R.id.but_right})
    public void show(View view) {
        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        switch (view.getId()) {
            case R.id.but_left:
                if (fragment1 == null) {
                    fragment1 = new TopFragment1();
                }
                transaction.replace(R.id.frame_layout, fragment1);
                break;
            case R.id.but_right:
                if (fragment2 == null){
                    fragment2 = new TopFragment2();
                }
                transaction.replace(R.id.frame_layout, fragment2);
                break;
            default:
                break;
        }
        transaction.commit();
    }
}

补充说明:
Fragment的切换有两种方式,第一种是add()+show()+hide()的方式,第二种是replace()的方式,关于它们的区别,后面我会写一篇文章来总结。

下面我们来进行测试:

  1. 点击Fragment1按钮,将TopFragment1添加到Activity中,生命周期如下:

    可以看到,Fragment的创建过程比Activity多了几个方法:
    onAttach():Fragment与Activity建立关联时调用
    onCreateView():为Fragment加载布局时调用
    onActivityCreated():当Activity的 onCreate() 方法执行完后调用

  2. 然后点击Fragment2按钮,将TopFragment2添加到Activity中,生命周期如下:

    当我们切换Fragment时,首先Activity会与Fragment2建立关联,然后创建Fragment2,接下来暂停、销毁Fragment1(因为我们使用的是replace()方式切换Fragment,会默认销毁前一个Fragment的实例),然后为Fragment2加载布局,启动Fragment2。
    onDestroyView():与onCreateView相对应,Fragment的布局被移除时调用
    onDetach():Activity与Fragment解除关联时调用

  3. 再切换回Fragment1,又会创建Fragment1的实例,并移除Fragment2:
4 接下来按back键退出,会销毁Fragment1:

根据上面的测试,我们对Fragment的生命周期已经有了清晰的认识了,不过Fragment不独立存在,一般都是和Activity关联使用,因此我们还需要了解Fragment与Activity生命周期是如何穿插在一起的。
如果你想熟悉一下Activity的生命周期,可以参考:Android笔记(一) | Activity的生命周期

Activity与Fragment生命周期的关系

在前面的基础上,我们只需要重写Activity生命周期的各个方法,并打印出来:

public class MainActivity extends AppCompatActivity {

    private final String TAG = "MainActivity";

    private TopFragment1 fragment1;
    private TopFragment2 fragment2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        Log.d(TAG, "onCreate");
    }

    @OnClick({R.id.but_left, R.id.but_right})
    public void show(View view) { ··· }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart");
    }
}

接下来再来测试:
为了观察Activity与Fragment的生命周期是如何交叉在一起的,我们查看静态加载的ButtomFragment的生命周期(需要重写ButtomFragment生命周期的的各个方法,并打印,和前面TopFragment一样),因为静态加载是和Activity一起创建的。

  1. 创建
  2. 息屏
  3. 亮屏
  4. 进入别的Activity
  5. 再回到MainActivity
  6. 按back键退出

有关Fragment的基本知识就是这些了,在实际项目中Fragment的使用十分灵活,还得自己慢慢摸索。


上一篇:Android基础回顾(二)| 常用控件 — ListView和RecyclerView
下一篇:Android基础回顾(四)| 关于广播机制


上一篇下一篇

猜你喜欢

热点阅读